class MyClass
def test
...
end
end
tmp = MyClass.new
tmp.test do |t|
"here"
end
为什么我收到错误
multiple values for a block parameter (0 for 1)
答案 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.test
到yield
一个值,它会暂时调用t
并传递给块(想想这个块是一个函数,您将yield
语句作为参数传递给它。在您的情况下,方法test
方法不能是yield
任何东西,因此消息“(0 for 1)”意味着它看到零对象yield
期待看到一个。我不知道您的test
代码的作用,但请检查并确保test
yield
只有一个值。