2010-01-11 77 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