不直接,不。一种选择是使用 Ruby 标准库中的OpenStruct。
require "ostruct"
class Foo
extend Forwardable
delegate :@data, :some_value, :other_value
def initialize(hash)
@data = OpenStruct.new(hash)
end
end
hash = { some_value: 42, other_value: 31415 }
foo = Foo.new(hash)
foo.some_value # => 42
一个更简单的选择是只委托:[] 方法,但它不是那么漂亮:
class Foo
extend Forwardable
delegate :@data, :[]
def initialize(hash)
@data = hash
end
end
hash = { some_value: 42, other_value: 31415 }
foo = Foo.new(hash)
foo[:some_value] # => 42
除此之外,总是有define_method:
[ :some_value, :other_value ].each do |meth|
define_method(meth) { @data[meth] }
end
或method_missing:
def method_missing(meth, *args, &block)
return @data[meth] if @data.key?(meth)
super
end
def respond_to_missing?(meth, *args)
@data.key?(meth) || super
end