class MyClass
def test
...
end
end
tmp = MyClass.new
tmp.test do |t|
"here"
end
为什么会收到错误红宝石块参数错误
multiple values for a block parameter (0 for 1)
class MyClass
def test
...
end
end
tmp = MyClass.new
tmp.test do |t|
"here"
end
为什么会收到错误红宝石块参数错误
multiple values for a block parameter (0 for 1)
有了您的帮助,我能得到的代码工作像这样
class MyClass
def test
a = yield self
puts a
end
end
tmp = MyClass.new
tmp.test do |t|
"here"
end
谢谢,我不得不调整你的代码了一点,但它的作品,我想现在的方式。
如果试验是用yield语句,确定到达该语句时,如果有对产量语句中的参数,该参数将被放入块变量t中。因此,如果您有:
def test
.....
yield x
......
end
那么x将是执行yield时的t值。
如何在测试方法中访问“此处”? – Bob 2010-01-11 01:35:36
你不能......测试只能通过一些东西到块,而不是相反。为了将“here”传递给测试方法,您应该修改测试方法以接受另一个参数,并在方法调用中将“here”作为相应的实际参数。 – 2010-01-11 01:38:54
这里有一个稍长例如,根据您的代码:
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
将输出“这里”运行该代码。
发生了什么是有一个方法测试,可以采取一块代码,所以你可以用do .. end语法来调用它。因为它传递一个arg来产生,所以这个arg对块是可用的,所以你可以使用do | some_arg_name | ...结束语法。
产量是块在测试方法中执行的地方,在这种情况下我会自我传递。由于块现在可以访问self(MyClass的一个实例),块可以调用my_own_puts方法,并打印出“here”。
不幸的是,我需要保持代码的调用片段与我的原始示例中的一样,还有其他想法吗? – Bob 2010-01-11 01:49:33
如果您没有将合格率传递给收益率,那是您将得到的错误。你不能使用“do | t |”如果没有从收益中获得“t”的话。 – 2010-01-11 01:59:21
传递一个块到一个函数(如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
只有一个值。
实际上,我的想法不是将一个块传递给一个函数,那段代码是我无法改变的东西(这是一个任务的一部分),是的,如果这取决于我,我会走明显而简单的路线。 – Bob 2010-01-11 19:12:02
请发布您的测试代码 – ennuikiller 2010-01-11 01:31:06
实际上这就是我想弄清楚的,我需要从测试方法中访问“这里”,目前还没有运气。 – Bob 2010-01-11 01:47:25
而且调用代码需要保持与上面相同,还有什么我可以更改测试或MyClass获得访问“这里” – Bob 2010-01-11 01:48:26