我如何使用参数值作为对象的实例变量名?
这是对象
Class MyClass
def initialize(ex,ey)
@myvar = ex
@myothervar = ey
end
end
我有以下方法
def test(element)
instanceofMyClass.element #this obviously doesnt work
end
如何让test方法返回myvar或myothervar值,具体取决于element参数。我不想写一个if条件,我想在可能的情况下将myvar或myother var via元素传递给对象实例。
答案 0 :(得分:4)
def test(element)
instanceofMyClass.send(element.to_sym)
end
如果instanceofMyClass没有响应元素,你将得到一个丢失的方法错误。
答案 1 :(得分:3)
def test(element)
instanceofmyclass.instance_variable_get element
end
test :@myvar # => ex
test :@myothervar # => ey
答案 2 :(得分:0)
我喜欢send()
的简单性,虽然它的一个坏处是它可以用来访问私有。问题仍然是下面的解决方案,但至少它是明确指定的,读者可以看到哪些方法将被转发。第一个只使用委托,而第二个使用更动态的方式来动态定义方法。
require 'forwardable'
class A
extend Forwardable
def_delegators :@myinstance, :foo, :bar
class B
def foo
puts 'foo called'
end
def bar
puts 'bar called'
end
def quux
puts 'quux called'
end
def bif
puts 'bif called'
end
end
def initialize
@myinstance = B.new
end
%i(quux bif).each do |meth| # note that only A#quux and A#bif are defined dynamically
define_method meth do |*args_but_we_do_not_have_any|
@myinstance.send(meth)
end
end
end
a = A.new
a.foo
a.bar
a.quux
a.bif