Как вызвать пользовательский метод для объекта? - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть класс с несколькими методами:

class Test
  def initialize (age, height)
    @age = age
    @height = height
  end

  def older
    @age = @age + 2
  end

  def shorter
    @height = @height - 5
  end
end

man = Test.new(40, 170)
man.older
man.shorter

[...]

Я хочу передать объекту man собственный метод, то есть я хочу написать что-то вроде man.variablemethod и установить .variablemethod на .older или .shorter, в зависимости от некоторых других факторов. Как я могу это сделать?

Я понял, что могу вызвать "if condition then man.older", но я не хочу использовать if, особенно когда у меня есть двадцать различных методов на выбор.

1 Ответ

3 голосов
/ 15 февраля 2012

Звучит так, как вам нужно send:

man.send(method_name)

Вы можете передать строку или символ, представляющий имя метода, который вы хотите вызвать, и даже передать дополнительные аргументы:

def man.older_by_increment(years)
  @age += years
end

man.send(:older_by_increment, 7)

Это также позволяет вам вызывать закрытые и защищенные методы из любого места:

class Man

  # ...

  private

  def weight
    @weight
  end
end

Man.new.weight         # => private method `weight' called for #<Man:0x10bc956d8> (NoMethodError)
Man.new.send(:weight)  # => @weight
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...