以下是我在Python中经常做的事情:
simple_call = lambda name: extract(some[fairly][hidden], name)
result1 = simple_call('myname')
result2 = simple_call('yourname')
result3 = simple_call('hisname')
如果你必须反复从一些复杂的数据结构或一些奇怪的API中提取一些数据,这非常方便。
有没有办法在Ruby中做同样的事情?
答案 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"