2013-10-28 37 views
0

一邊做鍛鍊this頁面的底部,調用塊,事情執行超出了預期的順序

我對解決方案幫助你看到下面:

什麼繼續,雖然是我煩死了第4行。看起來block.callputs甚至開始寫入屏幕之前全部運行。

這只是接受關於Ruby的東西嗎?如果我試圖查看它,我甚至稱這種行爲爲何?

def log(desc, &block) 
    puts "Beginning #{desc}..." 
    #block.call seems to be occurring here! 
    puts "... #{desc} finished, returning: #{block.call}" 
end 

someLittle = lambda {5} 

yetAnother = lambda {'I like Thai food!'} 

outer = lambda do 
    log "some little block", &someLittle 
    log "yet another block", &yetAnother 
    false 
end 

log "outer block", &outer 
+0

我沒有得到你的confusion..Is這不是給你預期的輸出?如果是這樣,你的預期產出是什麼,你得到了什麼?告訴這些東西.. –

+0

寫它的方式,我期望它放第2行。然後放第4行,然後運行由block.call調用的所有其他塊。 – dwilbank

+0

取而代之的是第2行,然後跳過第4行的提示,因此它可以運行並放入由block.call引起的所有額外調用,然後纔打印出第4行。 – dwilbank

回答

0

讓我們看看下面的例子:

greeting = "Howdy!" 
puts "#{greeting} What's up?" 

這裏你這是傳遞給Ruby的Kernel#puts方法的字符串內插greeting變量。因此,greeting需要先進行定義和評估,然後再進行插值(或進行任何其他操作,例如串聯等)。

你明白了嗎?

現在讓我們看看你的例子:

puts "... #{desc} finished, returning: #{block.call}" 

在這裏也descblock.call需要先解釋字符串內插前。

如何比較與其他語言的這種行爲:http://en.wikipedia.org/wiki/String_interpolation

+0

我看到它需要提前解釋,但我從未預料到它會被提前執行。我想這就是練習的重點。 – dwilbank