Руби передавая блоки в блоки - PullRequest
0 голосов
/ 21 сентября 2011
(1..5).each do|x| puts yield(x) end do |x| return x*2 end

В моей голове этот цикл с 1 по 5 вызовет первый блок, который уступит второму блоку, и поместит 2,4,6,8,10

Почему это не работает и какой самый простой способ написать это.

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

yield работает в рамках методов.Цитата из "Programming Ruby":

Внутри метода блок может быть вызван, как если бы это был сам метод, с использованием оператора yield.

Итак, если вы хотите, чтобы этот код работал, вы можете изменить его на что-то вроде этого:

def f(n)
  (1..n).each do |x|
    puts yield(x)
  end
end

f(5) do |x|
  x * 2
end

Если вы не хотите определять метод, вы должны поместить блок в переменную и затем использовать его:

b = Proc.new{|x| x *2 }

(1..5).each do |x|
  puts b.call(x)
end
1 голос
/ 21 сентября 2011

Самый простой способ написать это:

(1..5).each { |x| puts x*2 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...