Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何获取属性的节俭类型?_Ruby_Thrift - Fatal编程技术网

Ruby 如何获取属性的节俭类型?

Ruby 如何获取属性的节俭类型?,ruby,thrift,Ruby,Thrift,我想自动处理许多属性。 但我的数据是从文件中读取的,它们是字符串类型。。。 我想知道是否有一个解决方案来了解属性的类型。 由于这一点,我将能够将字符串转换为正确的类型 struct Test{ 1: i32 id, 2: string name, 3: Enumeration genre } test = Test.new 执行以下操作的方法(例如): 等等 我可以使用test.id.class,但它不起作用。。(它告诉我没有分配nilClass) 即使“id”是i32 test.id =

我想自动处理许多属性。 但我的数据是从文件中读取的,它们是字符串类型。。。 我想知道是否有一个解决方案来了解属性的类型。 由于这一点,我将能够将字符串转换为正确的类型

struct Test{
1: i32 id,
2: string name,
3: Enumeration genre
}

test = Test.new
执行以下操作的方法(例如):

等等

我可以使用test.id.class,但它不起作用。。(它告诉我没有分配nilClass)

即使“id”是i32

test.id = "blabla"  => works... (normally, it shouldn't)
仅当您尝试序列化。。。在将值指定给节俭对象时不会


谢谢大家!

这可能会有所帮助:
节俭。如果类型不匹配,则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_字段。每个{fid,v|放置“{fid}:{v[:name]}{v[:type]}”}

如果使用struct类,还可以将字段ID作为键输入到
struct\u字段中
并引用了字段名(所有大写),所以您可以对此做些什么吗

test.struct_fields[Test::ID][:type]
值可以与
Thrift::type
中的常量匹配,例如
I16

分配后,还可以在结构上使用validate方法(这样可以避免序列化失败)
编辑:我说错了-验证方法不验证值,只验证存在必填字段。 我想没有这样的事情,因为当前的验证发生在特定的协议中。如果需要,您可以尝试序列化,也可以编写一个通用验证器,该验证器对给定字段使用类型(如上所示)进行测试


话虽如此,我查看了库代码,认为生成的访问器可以进行修改,看起来它们可能已经具备了该功能,请参见

是的,我今天成功了。。。但现在删除这篇文章已经太晚了。谢谢你,海德!我在Types.rb(在/lib/rb/lib of thrift)中找到了这个列表。使用它没有用。。。(我必须有一个带有名称和id的散列)并将一个值分配到带有“enum”的属性中,Thrift不会将字符串转换为enum的数字id,然后我必须使用const_get等。。。如何验证结构?(现在,我尝试了解…)更新的答案-
validate
方法只是验证是否填充了必填字段。我的错。再编辑一次,因为我可能已经找到了你一直在寻找的东西。谢谢!你是唯一一个用ruby编写节俭代码的人。。。我正在完成我已经开始的工作,我尝试着“节俭。键入\ u checking=true”。我当前的方法(obj.struct_fields[Object.const_get(name_of_class)::const_get(name.upcase)][:type]和一个hash number=>type的名称)工作得很好。@user3604482不客气,但我确信有很多(它们只是很忙),我只是碰巧在读/写部分修补了一些过去的东西,所以我知道去哪里找
test.struct_fields[Test::ID][:type]