reflection - 声明后如何访问 ProtoField 的名称?
问题描述
声明后如何访问 ProtoField 的 name 属性?
例如,类似于以下内容:
myproto = Proto("myproto", "我的原型")
myproto.fields.foo = ProtoField.int8("myproto.foo", "Foo", base.DEC)
打印(myproto.fields.foo.name)
我在哪里得到输出:
富
解决方案
另一种更简洁的方法:
local fieldString = tostring(field)
local i, j = string.find(fieldString, ": .* myproto")
print(string.sub(fieldString, i + 2, j - (1 + string.len("myproto")))
编辑:或者适用于任何协议的更简单的解决方案:
local fieldString = tostring(field)
local i, j = string.find(fieldString, ": .* ")
print(string.sub(fieldString, i + 2, j - 1))
当然,第二种方法只有在字段名称中没有空格的情况下才有效。由于情况不一定总是如此,因此第一种方法更稳健。这是包含在任何解析器都应该可用的函数中的第一个方法:
-- The field is the field whose name you want to print.
-- The proto is the name of the relevant protocol
function printFieldName(field, protoStr)
local fieldString = tostring(field)
local i, j = string.find(fieldString, ": .* " .. protoStr)
print(string.sub(fieldString, i + 2, j - (1 + string.len(protoStr)))
end
...在这里它正在使用中:
printFieldName(myproto.fields.foo, "myproto")
printFieldName(someproto.fields.bar, "someproto")
推荐阅读
- azure-active-directory - 列出来自 Microsoft Graph API 的用户属性
- r - 如何按照线性方程随机生成(x,y)点?
- react-native - 安装反应导航和手势处理程序后出现错误 gradlew.bat installDebug
- python-3.x - 来自数据框的复杂嵌套字典
- r - roxygen 方法的包文档
- android - FCM 自定义通知声音不起作用
- java - 如何链接到类类型创建另一个类类型的对象
- python - 使用 ext 的 python 用户名/密码程序。文件。工作直到有多个用户
- node.js - Puppeteer 中的多个 .click() 事件
- rust - 如何使用 RAII 属性创建订阅者对象?