2014-11-23 1 views

ответ

1

Вы не можете использовать отправку для вызова лямбда. Но вы можете использовать Eval ('mylambda'). Называют для вызова

+0

вы имели в виду внешнюю переменную, переменную, определенную в другом контексте. ? если это так, как вы даже пытаетесь использовать send. – Saravanan

1

Для вызова метода лямбда вы можете либо

mylambda.call 
# => nil 

или

mylambda.() 
# => nil 

Если вы хотите, чтобы вызвать lambda с использованием строки в качестве ее имени переменной вы не можете - см. here для альтернатив получения других ссылок по их именам)

+0

@ Август - да, я только что понял, отредактировал мой ответ –

+0

Еще два пути: [ProC# [\]] (http://www.ruby-doc.org/core-2.1.5/Proc.html # method-i-5B-5D) и [ProC# yield] (http://www.ruby-doc.org/core-2.1.5/Proc.html#method-i-yield). –

3

Вы не можете получить доступ к локальным переменным по имени, не используя eval.

Вот несколько альтернатив, вы можете попробовать:

  • Хранение лямбды в Hash:

    hash = { 
        'mylambda' => ->{ 'foo' } 
    } 
    hash['mylambda'].call # => "foo" 
    
  • Хранение лямбды в переменном экземпляре:

    @mylambda = ->{ 'foo' } 
    instance_variable_get('@mylambda').call # => "foo" 
    
  • Создание временного метода с использованием лямбда

    mylambda = ->{ 'foo' } 
    define_method :temp, &mylambda 
    send(:temp) # => "foo" 
    
1

Если у вас есть правильный Binding для контекста вашей локальной переменной, вы можете использовать Binding#local_variable_get, чтобы получить значение локальной переменной. И получить Binding для текущего контекста, вы можете использовать Kernel#binding:

binding.local_variable_get(:mylambda).()