ruby - `send` 替代 Ruby 中的 lambda

标签 ruby dynamic lambda metaprogramming send

send 不适用于 Ruby 中的 lambda:

>> def mymethod; end
=> :mymethod
>> send('mymethod')
=> nil

>> mylambda = ->{}
=> #<Proc:0x9f2fe28@(pry):136 (lambda)>
>> send('mylambda')
=> NoMethodError: undefined method `mylambda' for main:Object

如何通过字符串动态调用 lambda?

最佳答案

如果不使用 eval,则无法通过名称访问局部变量。

以下是您可以尝试的一些替代方案:

  • 将 lambda 存储在 Hash 中:

    hash = {
      'mylambda' => ->{ 'foo' }
    }
    hash['mylambda'].call # => "foo"
    
  • 将 lambda 存储在实例变量中:

    @mylambda = ->{ 'foo' }
    instance_variable_get('@mylambda').call # => "foo"
    
  • 使用 lambda 创建临时方法

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

关于ruby - `send` 替代 Ruby 中的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27091899/

相关文章:

ruby - 为什么人们使用 `Module.send(:prepend, …)` ?

c++ - 是否有嵌套类的用例?

lambda 中的 Java 8 lambda 无法修改来自外部 lambda 的变量

java - 将方法作为参数传递——这可能吗?

ruby - 如何使用带有 Ruby Google API Client 的 Gmail API 发送消息?

ruby-on-rails - 通过 searchkick 进行多语言搜索

postgresql - postgresql 中的动态更新

c# - 动态地从动态对象中获取值

dynamic - qTip 动态宽度

lambda - 在Java 8中,当我使用stream()和filter()时,我可以保留与主对象相关的对象(而不是对象本身)吗?