【问题标题】:Is it possible to use Lambdas like this in Ruby?是否可以在 Ruby 中使用这样的 Lambda?
【发布时间】:2011-08-10 10:06:34
【问题描述】:

这是我在 Python 中经常做的事情:

simple_call = lambda name: extract(some[fairly][hidden], name)
result1 = simple_call('myname')
result2 = simple_call('yourname')
result3 = simple_call('hisname')

如果你必须从一些复杂的数据结构或一些奇怪的 API 中重复提取一些数据,这真的很方便。

有没有办法在 Ruby 中做同样的事情?

【问题讨论】:

    标签: python ruby lambda closures


    【解决方案1】:

    简短回答:不。最接近的是:

    simple_call = lambda {|name| extract(some[:fairly][:hidden], name) }
    result1 = simple_call.call("myname")
    result2 = simple_call.call("yourname")
    result3 = simple_call.call("hisname")
    

    为什么?因为 Ruby 中的括号是可选的。然后,您需要告诉 ruby​​ 调用该方法。例如,在 Python 中你可以这样做:

    another_simple_call = simple_call
    

    您将 lambda 分配给 another_simple_call。但在 Ruby 中,没有办法知道您是使用零参数分配还是调用 simple_call。

    【讨论】:

    • 您正在使用可能最冗长的代码。对于 Ruby 1.9,我会这样做:simple_call = ->(name){ ... }; result1 = simple_call['byname'] 这几乎正是 OP 所拥有的,将你的“否”。变成“是”。
    • 没明白你的意思,你可以在another_simple_call = simple_call 之类的简单分配中轻松分配labmda。调用lambda[].call)的括号不是可选的。只有对象方法可以不带括号调用。
    • @Phrogz 很好,我记得读过一次,但我还没有将它集成到我的项目中。这可能会成为执行 lambdas 的首选方式吗?
    • Phrogz,指向 -> 语法。恕我直言,simple_call['byname'] 不一致,所以我倾向于忘记它。
    【解决方案2】:

    是的,有一种方法可以在 Ruby 中做同样的事情。实际上是一样的(当然,以 Python 和 Ruby 之间的细微语法差异为模):

    simple_call = ->name { extract(some[fairly][hidden], name) }
    result1 = simple_call.('myname')
    result2 = simple_call.('yourname')
    result3 = simple_call.('hisname')
    

    【讨论】:

      【解决方案3】:

      Ruby 中的等价物是

      a = Proc.new{|name| do_something_with(name) }
      
      a.call("anyname")
      

      【讨论】:

        【解决方案4】:

        我做这种事情的另一种方法是尝试使用块和地图命令而不是 lambdas。

        所以做一些类似的事情:

        result1, result2, result3 = %w(myname yourname hisname).map {|name|
            extract(some[fairly][hidden], name)
        }
        

        我觉得它读起来好一点。

        【讨论】:

        • 有趣的解决方案。不适用于我的情况,但非常有趣!谢谢!
        • +1。通常,要么一个块就可以了,否则一个实际的方法就是要走的路。
        【解决方案5】:

        是的:

        arbitrary_data_structure = {
          :foo => {
            :bar => "1",
            :baz => "2",    
          }
        }
        
        extract_process = lambda { |x| arbitrary_data_structure[:foo][x] }
        
        puts extract_process.call(:bar) # => "1"
        puts extract_process.call(:baz) # => "2"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-19
          • 1970-01-01
          • 2021-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多