1

执行代码时出现以下错误:

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)

我的动机是用目标参数调用块。

我怎样才能在课外传递一个块。请提供任何帮助。

4

2 回答 2

1

这是你的代码:

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)

您需要定义 lambda 或 proc 并将其存储在变量中,或使用 each 的隐式块。下面是一个使用 lambda 的示例:

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!" }
于 2017-06-17T20:18:00.790 回答
0

好吧,问题就在这里:

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'seach方法并传递一个块。

于 2017-06-17T19:57:18.850 回答