我想自动处理许多属性。 但我的数据是从文件中读取的,它们是字符串类型... 我想知道是否有解决方案来了解属性的类型。 多亏了这一点,我能够将字符串转换为正确的类型。
struct Test{
1: i32 id,
2: string name,
3: Enumeration genre
}
test = Test.new
执行(例如)的方法:
puts test.id.type => Give me i32
puts test.name.type => Give me string
等。
我可以使用test.id.class但它不起作用..(它告诉我nilClass什么时候没有被分配)
即使" id"是i32,
test.id = "blabla" => works... (normally, it shouldn't)
仅当您尝试序列化时才进行类型验证...而不是在将值分配给thrift对象时。
谢谢!
答案 0 :(得分:1)
这可能会有所帮助:Thrift.type_checking=true
,如果类型不匹配,将导致引发异常
>> Thrift.type_checking
=> false
>> Thrift.type_checking=true
=> true
>> test=Test.new
=> Test id:nil, name:nil
>> test.id="Hi"
Thrift::TypeError: Expected Types::I32, received String for field id
from /usr/lib/ruby/gems/1.8/gems/thrift-0.9.1.1/lib/thrift/types.rb:69:in `check_type'
from /usr/lib/ruby/gems/1.8/gems/thrift-0.9.1.1/lib/thrift/struct.rb:157:in `id='
from (irb):4
原创回答
不确定您正在寻找什么,但似乎寻找特定于节俭的反思
如果有帮助,您可以获取结构的成员类型列表
test.struct_fields.each{|fid,v| puts "#{fid}: #{v[:name]} #{v[:type]}"}
如果你使用了struct类,你也可以将字段ID作为struct_fields
的密钥
并引用了字段名称(所有大写字母),你可以用它做点什么吗?
test.struct_fields[Test::ID][:type]
可以将值与Thrift::Types
中的常量匹配,例如I16
您也可以在分配之后对结构使用validate方法(这样可以避免序列化失败)
编辑:我错过了 - 验证方法不验证值,只是存在必需的字段。
我想没有这样的事情,因为当前的验证发生在特定的协议中。您可以根据需要尝试序列化,或者只编写一个通用验证器,对于给定的字段,它使用类型(如上所示)来测试
已经说过了 - 我检查了库代码,认为可以修改生成的访问器来执行它,看起来他们可能已具备该功能,请参阅https://github.com/apache/thrift/blob/master/lib/rb/lib/thrift/struct.rb#L157