Ruby - 如何使用method参数作为变量的名称?

时间:2010-02-24 20:21:29

标签: ruby

我如何使用参数值作为对象的实例变量名?

这是对象

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元素传递给对象实例。

3 个答案:

答案 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