可以在Ruby中使用这样的Lambdas吗?

bas*_*ibe 2 ruby python lambda closures

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

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

如果您必须从一些复杂的数据结构或一些奇怪的API中反复提取一些数据,这非常方便.

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

Ser*_*abe 6

简答:不.最接近的是:

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

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

another_simple_call = simple_call
Run Code Online (Sandbox Code Playgroud)

你正在分配lambda another_simple_call.但是在Ruby中,没有办法知道你是否使用零参数分配或调用simple_call.

  • 您正在使用最详细的代码.对于Ruby 1.9,我会这样做:`simple_call = - >(name){...}; result1 = simple_call ['byname']`这几乎就是OP所拥有的,转为你的"号" 成为"是的". (5认同)
  • 没有明白你的意思,你可以轻松地在`another_simple_call = simple_call`之类的简单赋值中指定`labmda`.调用`lambda`(`[]`或`.call`)的括号不是可选的.只能在没有括号的情况下调用对象方法. (2认同)

Jör*_*tag 6

是的,有一种方法可以在Ruby中做同样的事情.它实际上是以同样的方式(模块化Python和Ruby之间的小的语法差异,当然):

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


arn*_*nep 5

Ruby中的等价物就是

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

a.call("anyname")
Run Code Online (Sandbox Code Playgroud)