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

时间:2011-08-10 10:06:34

标签: python ruby lambda closures

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

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

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

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

5 个答案:

答案 0 :(得分: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")

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

another_simple_call = simple_call

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

Ruby中的等价物是

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

a.call("anyname")

答案 3 :(得分:4)

我这样做的另一种方法是尝试使用块和map命令而不是lambdas。

做类似的事情:

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

我发现它看起来好一点。

答案 4 :(得分:2)

是的:

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"