Ruby: передача блоков в качестве параметров из класса oustide
Я получаю ниже ошибку при выполнении кода:
example.rb:9:in `<main>': undefined method `each' for main:Object (NoMethodError)
Строка 9 - вторая последняя строка в моем коде.
Мой код:
class TargetProvider
def each(target,&block)
block.call(target)
end
end
tp = TargetProvider.new
each { puts "Hello!" }
tp.each(1, each)
Мой мотив - вызвать блок с целевым параметром.
Как я могу пройти блок за пределами класса. Любая помощь, пожалуйста.
2 ответа
Вот ваш код:
class TargetProvider
def each(target,&block)
block.call(target)
end
end
tp = TargetProvider.new
each { puts "Hello!" } # this line is trying to run a method called each
tp.each(1, each)
Вам нужно определить лямбду или процедуру и сохранить их в переменной или использовать неявный блок каждого из них. Вот пример использования лямбды:
class TargetProvider
def each(target,&block)
block.call(target)
end
end
tp = TargetProvider.new
each_block = lambda { |a| puts "Hello!" }
tp.each(1, &each_block)
Вот пример использования неявного блока:
class TargetProvider
def each(target,&block)
block.call(target)
end
end
tp = TargetProvider.new
each_block = lambda { |a| puts "Hello!" }
tp.each(1) { puts "Hello!" }
Ну, проблема здесь:
tp = TargetProvider.new
each { puts "Hello!" } # Here
tp.each(1, each)
Здесь вы звоните each
метод, не объявляя новую переменную. В Ruby, если вы вызываете метод без указания его объекта (через object.method
), интерпретатор ищет этот метод в MainObject
,
Понятно, что такого метода в нем нет, поэтому в этом и заключается ошибка.
То, что вы можете достичь, выглядит следующим образом:
tp = TargetProvider.new
tp.each(1) { puts "Hello!" }
Этот код вызывает TargetProvider
"s each
метод, передающий это блок.