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