Можно ли использовать Lambdas как это в Ruby? - PullRequest
2 голосов
/ 10 августа 2011

Вот что я делаю довольно часто в 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 ]

6 голосов
/ 10 августа 2011

Да, есть способ сделать то же самое в Ruby. И это на самом деле так же (по модулю незначительных синтаксических различий между Python и Ruby, конечно):

simple_call = ->name { extract(some[fairly][hidden], name) }
result1 = simple_call.('myname')
result2 = simple_call.('yourname')
result3 = simple_call.('hisname')
6 голосов
/ 10 августа 2011

Краткий ответ: Нет. Ближайшая вещь:

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

И вы назначаете лямбду на another_simple_call.Но в Ruby не было бы никакой возможности узнать, назначаете ли вы или вызываете simple_call с нулевыми аргументами.

5 голосов
/ 10 августа 2011

Эквивалентом в Ruby будет

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

a.call("anyname")
4 голосов
/ 10 августа 2011

Еще один способ, которым я делаю подобные вещи, это попытаться использовать блоки и команду карты, а не лямбды.

Так что сделайте что-то вроде:

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

Я считаю, что это читаетсянемного лучше.

2 голосов
/ 10 августа 2011

Yep:

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"
...