Как сказал ennuikiller, вы должны определить, как вы хотите назвать переменную (и), которая передается обратно из оператора yield
. Это связано с областью действия переменной. Область внутри блока, который вы передаете test_method
, не знает о переменной i
. Вы можете называть это как угодно.
Например, вы можете сделать следующее:
def test_method
["a", "b", "c"].map { |i| yield(i) }
end
p test_method { |some_variable_name| some_variable_name.upcase }
То, что тестовый метод знает об этом, не означает, что блок, который вы передаете тестовому методу, узнает об этом.
Редактировать 1: Чтобы дать немного больше информации, вы можете переопределить test_method
следующим образом, если это делает его немного более понятным:
def test_method(&block)
if not block.nil?
["a", "b", "c"].map { |i| yield(i) }
end
end