【发布时间】:2011-11-10 20:33:28
【问题描述】:
我有一门课,像这样的:
class A
attr_accessor(:field2)
attr_accessor(:field1)
end
使用从类实例中获取的键和值生成哈希的最佳方法是什么?
用该哈希值填充类 A 的实例的最佳方法是什么?
=====
我可能正在寻找类似于 JavaBeans 内省的东西,它会给我数据对象字段的名称,然后根据此信息执行逻辑。 Ruby 是一种非常现代的灵活和动态语言,我拒绝承认它不会让我做我可以用 Java 轻松完成的事情 ;-)
=====
最后我发现 Struct 是最好的选择:
a = {:a => 'qwe', :b => 'asd'}
s = Struct.new(*a.keys).new(*a.values) # Struct from Hash
h = Hash[*s.members.zip(s.values).flatten] # Hash from Struct
【问题讨论】:
-
你必须在某个地方定义field1和field2是你感兴趣的字段,一个类有很多方法...
-
是的,很多方法,但是我对字段感兴趣,真的没有办法判断一个类是否只有两个字段吗?类似于 JavaBeans 自省的东西?
-
AFAIK attr_accessor 透明地添加了 getter/setter,因此您无法从“普通”方法/实例变量中区分它们。
-
@Oleg 它可以,但是如果你只对字段感兴趣,并且想要一个通用的解决方案,你不能依赖方法.在 Java 中也是如此:getter 可以在没有相应属性的情况下存在(并且经常这样做,例如,通过 JSP EL 向视图层公开数据)。
-
我不确定你的最终目标是什么:如果是序列化/反序列化,为什么不使用 JSON 或 YAML 并使用已经存在的东西?