Передача лямбды как блок

Я пытаюсь определить блок, что я буду использовать для передачи каждый метод нескольких диапазонов. Вместо того, чтобы переопределять блок на каждом диапазоне, я хотел бы создать lamba и передать лямбду как таковую:

count = 0
procedure = lambda {|v| map[count+=1]=v}
("A".."K").each procedure
("M".."N").each procedure
("P".."Z").each procedure

Однако я получаю следующую ошибку:

ArgumentError: wrong number of arguments(1 for 0)
    from code.rb:23:in `each'

Какие-либо идеи, что продолжается здесь?

57
задан 17 November 2011 в 10:05

1 ответ

Другие ответы оставили что-то неразъясненным, что я хотел бы подробно остановиться. Как мы передаем аргумент и блок к методу?

предположим у нас есть метод, который берет аргумент и блок:

def method_with_arg_and_block(arg)
  puts arg
  yield
end

и proc:

pr = proc { puts 'This is a proc'}

ответ: важно, чтобы Вы передали proc в как аргумент с амперсандом вместо того, чтобы добавить proc к методу (как Вы, сделал бы с блоком).

, Например, если Вы делаете:

method_with_arg_and_block('my arg') &pr

Вы доберетесь, "никакой данный блок (приводят)" к исключению.

корректный способ назвать это:

method_with_arg_and_block('my arg', &pr)

Ruby будет заботиться о преобразовании proc к блоку и добавлению его к Вашему методу.Примечание: так как лямбды также procs, это будет работать с лямбдами также.

Благодаря https://medium.com / sihui/proc-code-block-conversion-and-ampersand-in-ruby-35cf524eef55 для помощи мне понять это.

1
ответ дан 1 November 2019 в 16:44

Другие вопросы по тегам:

Похожие вопросы: