我有一个哈希表
foo = {'bar'=>'baz'}我想给foo.bar #=> 'baz'打电话
我的动机是将activerecord查询重写为原始sql查询(使用Model#find_by_sql)。这将返回一个以SELECT子句值作为键的散列。但是,我的现有代码依赖于object.method点表示法。我想做最小的代码重写。谢谢。
编辑:看起来Lua有这个功能:
point = { x = 10, y = 20 } -- Create new table
print(point["x"]) -- Prints 10
print(point.x) -- Has exactly the same meaning as line above发布于 2009-11-18 12:03:58
>> require 'ostruct'
=> []
>> foo = {'bar'=>'baz'}
=> {"bar"=>"baz"}
>> foo_obj = OpenStruct.new foo
=> #<OpenStruct bar="baz">
>> foo_obj.bar
=> "baz"
>>发布于 2009-11-18 11:44:20
您要查找的内容名为OpenStruct。它是标准库的一部分。
发布于 2010-09-10 18:40:57
一个很好的解决方案:
class Hash
def method_missing(method, *opts)
m = method.to_s
if self.has_key?(m)
return self[m]
elsif self.has_key?(m.to_sym)
return self[m.to_sym]
end
super
end
end注意:这个实现只有一个已知的bug:
x = { 'test' => 'aValue', :test => 'bar'}
x.test # => 'aValue'如果您更喜欢符号查找而不是字符串查找,则交换两个' If‘条件
https://stackoverflow.com/questions/1753336
复制相似问题