как вывести / константировать строку в метод, а затем передать ей аргументы - PullRequest
3 голосов
/ 29 сентября 2011

Дано:

s = "foo_bar_path"

Как я могу оценить или констатировать s и передать ему аргументы, например, мой конечный результат будет эквивалентен:

foo_bar_path(@myvar, @foobar)

Я пытался eval(s).send, но, похоже, это не сработало. И constantize, кажется, работает только на классах?

Ответы [ 2 ]

11 голосов
/ 29 сентября 2011

Вы бы просто использовали метод send (или public_send в зависимости от ваших потребностей) на соответствующем объекте:

some_object.send(s, @myvar, @foobar)

или если вы хотите вызвать метод для себя:

self.send(s, @myvar, @foobar)

В документации написано "символ", но send так же рад получить имя метода в строке.

2 голосов
/ 07 августа 2012

Еще один способ такого рода вещей (лучше для OpenStruct):

#for more in this domain, see the Ruby core API for the Object class
class Demo
  def initialize(n)
    @iv = n
  end
  def hello()
    "Hello, @iv = #{@iv}"
  end
end

k = Demo.new(99)
m = k.method(:hello)
m.call   #=> "Hello, @iv = 99"
...