2016-03-15 12 views
2

我正在嘗試一個愚蠢的例子來理解發送到方法的多個過程。然而,令我感到驚訝的是執行的順序。我查看了Proc文檔,但沒有真正找到解釋(可能我沒有仔細觀察)。Ruby中多個過程的執行順序

下面是一個例子:

def my_block(a, b) 
    a.call b.call 
end 

a = Proc.new { puts "hello" } 
b = Proc.new { puts " world" } 

my_block a, b 

輸出:

world 
hello 

給出多於一個上的行執行從左到右時這似乎是PROC執行。有人可以詳細解釋這種行爲嗎?

+0

這實際上是非常有趣的。現在我正試圖研究爲什麼發生這種情況! – dane

+0

謝謝@dane。欣賞任何幫助或投入。 ':'' –

+0

我可能認爲編譯器將「<<」它們轉換爲一個數組,因爲它們位於同一行,然後b.call實際上是放在ontop上? @ jaypal嘆息 – dane

回答

3

這是因爲這樣的:

a.call b.call 

是真的:

a.call(b.call()) 

所以b.call()得到擴展(並運行)第一次像任何醇」的編程語言,並把結果作爲參數傳遞給a

你會希望這會給出一個錯誤,但在Ruby中額外的參數塊中的錯誤不會導致(它是一個方法的錯誤,雖然)...

您可以使用一個分號明確地告訴紅寶石,開始一種新的表達:

a.call; b.call 

...但我會說那是相當unidiomatic和「非紅寶石」 ......

+0

謝謝你的解釋!當你從java來的時候很難掌握可選的parens! ':)' –

+1

@jaypalsingh如果你想知道爲什麼你沒有看到錯誤,那是因爲'call'接收到一個可變參數或任意數量的參數。在這種情況下,它對它們沒有任何作用。 – Mohamad

+0

感謝您的編輯。 '但是在Ruby中,額外的塊參數不會導致錯誤,這是記住一個重要的注意事項。 –

2

這只是因爲你把它們放在同一行上,所以b.call被稱爲a.call的參數。爲了這個工作,你期望你需要;

def my_block(a, b) 
    a.call 
    b.call 
end 
+0

是的,現在我明白了,你是對的!謝謝 – dane

+0

謝謝@ james2m! –