2010-01-11 75 views
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) 
+0

请发布您的测试代码 – ennuikiller 2010-01-11 01:31:06

+0

实际上这就是我想弄清楚的,我需要从测试方法中访问“这里”,目前还没有运气。 – Bob 2010-01-11 01:47:25

+0

而且调用代码需要保持与上面相同,还有什么我可以更改测试或MyClass获得访问“这里” – Bob 2010-01-11 01:48:26

回答

1

有了您的帮助,我能得到的代码工作像这样

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

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

谢谢,我不得不调整你的代码了一点,但它的作品,我想现在的方式。

1

如果试验是用yield语句,确定到达该语句时,如果有对产量语句中的参数,该参数将被放入块变量t中。因此,如果您有:

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

那么x将是执行yield时的t值。

+0

如何在测试方法中访问“此处”? – Bob 2010-01-11 01:35:36

+0

你不能......测试只能通过一些东西到块,而不是相反。为了将“here”传递给测试方法,您应该修改测试方法以接受另一个参数,并在方法调用中将“here”作为相应的实际参数。 – 2010-01-11 01:38:54

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 

将输出“这里”运行该代码。

发生了什么是有一个方法测试,可以采取一块代码,所以你可以用do .. end语法来调用它。因为它传递一个arg来产生,所以这个arg对块是可用的,所以你可以使用do | some_arg_name | ...结束语法。

产量是块在测试方法中执行的地方,在这种情况下我会自我传递。由于块现在可以访问self(MyClass的一个实例),块可以调用my_own_puts方法,并打印出“here”。

+0

不幸的是,我需要保持代码的调用片段与我的原始示例中的一样,还有其他想法吗? – Bob 2010-01-11 01:49:33

+1

如果您没有将合格率传递给收益率,那是您将得到的错误。你不能使用“do | t |”如果没有从收益中获得“t”的话。 – 2010-01-11 01:59:21

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的代码是什么,但请检查并确保testyield只有一个值。

+0

实际上,我的想法不是将一个块传递给一个函数,那段代码是我无法改变的东西(这是一个任务的一部分),是的,如果这取决于我,我会走明显而简单的路线。 – Bob 2010-01-11 19:12:02