Ruby块参数错误

时间:2010-01-11 01:25:49

标签: ruby

class MyClass
  def test
    ...
  end
end

tmp = MyClass.new
tmp.test do |t|
  "here" 
end

为什么我收到错误

multiple values for a block parameter (0 for 1)

4 个答案:

答案 0 :(得分:3)

这是一个稍长的示例,基于您的代码:

class MyClass
  def test
    yield self
  end

  def my_own_puts s
    puts s
  end

end

tmp = MyClass.new
tmp.test do |t|
  t.my_own_puts "here"
end

运行此代码将输出“here”。

发生的事情是有一个方法测试可以占用一段代码,因此您可以使用do .. end语法调用它。因为它将arg传递给yield,所以该块可用于arg,所以你使用do | some_arg_name |将这个arg赋予块。 ...结束语法。

yield是在测试方法中执行块的地方,在这种情况下我生成我传递给自己。由于块现在可以访问self(MyClass的一个实例),因此该块可以在其上调用my_own_puts方法,并打印出“here”。

答案 1 :(得分:1)

如果test用yield语句定义,当达到该语句并且yield语句中有参数时,该参数将被放入块变量t中。因此,如果你有:

def test
.....
yield x
......
end 

然后x将是执行yield时的t值。

答案 2 :(得分:1)

在您的帮助下,我能够让代码像这样工作

class MyClass
  def test
    a = yield self
    puts a
  end
end

tmp = MyClass.new
tmp.test do |t|
  "here" 
end

谢谢,我不得不调整一下你的代码,但它的工作方式与我现在的方式相同。

答案 3 :(得分:0)

将一个块传递给一个函数(正如Bob在他的回答中所示)在这种情况下是过度的。如果您正在阅读字符串并将其打印出来,那么您应该需要的是:

class MyClass
  def test(a)
    puts a
  end
end

tmp = MyClass.new
tmp.test("here")

使用块可能会正常运行,但是您调用了许多不必要的代码并使代码的真实性质不明确。

除了正确的块使用之外,让我解决您看到的特定错误消息。当你说tmp.test do |t|时,Ruby期待tmp.testyield一个值,它会暂时调用t并传递给块(想想这个块是一个函数,您将yield语句作为参数传递给它。在您的情况下,方法test方法不能是yield任何东西,因此消息“(0 for 1)”意味着它看到零对象yield期待看到一个。我不知道您的test代码的作用,但请检查并确保test yield只有一个值。