Ruby - Как использовать параметр метода в качестве имени переменной? - PullRequest
3 голосов
/ 24 февраля 2010

Как бы я использовал значение параметра в качестве имени переменной экземпляра объекта?

Это объект

Class MyClass    
    def initialize(ex,ey)
      @myvar = ex
      @myothervar = ey
    end
end

У меня есть следующий метод

def test(element)
  instanceofMyClass.element  #this obviously doesnt work
end

Как я могу заставить метод теста возвращать значение myvar или myothervar в зависимости от параметра элемента. Я не хочу писать условие if, я хочу передать myvar или myother var через элемент в экземпляр объекта, если это возможно.

Ответы [ 3 ]

4 голосов
/ 24 февраля 2010
def test(element)
  instanceofMyClass.send(element.to_sym)  
end

Вы получите ошибку отсутствующего метода, если instanceofMyClass не отвечает на элемент.

3 голосов
/ 24 февраля 2010
def test(element)
  instanceofmyclass.instance_variable_get element
end

test :@myvar # => ex
test :@myothervar # => ey
0 голосов
/ 08 октября 2014

Мне нравится простота 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...