Ruby:从oustide类

时间:2017-06-17 19:33:17

标签: ruby ruby-block

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

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 个答案:

答案 0 :(得分: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并将其存储在变量中,或使用每个变量的隐式块。 这是一个使用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!" }

答案 1 :(得分: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&#39;} each方法将其传递给一个块。