Я пытаюсь определить блок, что я буду использовать для передачи каждый метод нескольких диапазонов. Вместо того, чтобы переопределять блок на каждом диапазоне, я хотел бы создать 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'
Какие-либо идеи, что продолжается здесь?
Другие ответы оставили что-то неразъясненным, что я хотел бы подробно остановиться. Как мы передаем аргумент и блок к методу?
предположим у нас есть метод, который берет аргумент и блок:
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 для помощи мне понять это.