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