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 метод, передающий это блок.

Другие вопросы по тегам