2015-05-24 30 views
2
irb(main):186:0* begin puts "abc" end while false 
abc 
=> nil 
irb(main):187:0> puts "abc" while false 
=> nil 

因此,當您使用帶有while修飾符的塊時,該塊將執行一次(這似乎是許多其他語言中的do-while循環)。但是,如果您使用while修飾符的單個語句,則它更像是一個while循環,其中首先檢查條件。這尋求一種令人驚訝的行爲爲什麼存在?爲什麼修飾符與塊的行爲不同?

+0

在執行條件後的第一考慮,如果它不是,什麼會發生像'放foo除非真正'的陳述。如果在它後綴的語句之前未評估條件,則單行語法根本不起作用。 –

+0

我發現這個:https://blog.newrelic.com/2014/11/13/weird-ruby-begin-end/這導致了http://blade.nagaokaut.ac.jp/cgi-bin/scat。 rb/ruby​​/ruby​​-core/6745其中Matz自己說:「我很遺憾這個功能,如果可能的話,我想在將來刪除它。」 – matt

+0

@matt所以基本上「這是一個壞主意」。也許你應該回答,因爲它或多或少地回答了這個問題。 – Jamie

回答

1

這似乎只是一個語言的怪癖。 ... while condition作爲語句修飾符,除了,它位於begin ... end之後,其行爲與其他語言的do ... while循環相同。

Yukihiro Matsumoto(Matz,Ruby的創造者)有said he regrets this, and would like to remove this behaviour in the future if possible

有來自New Relic的,在那裏我找到了鏈接到郵件列表後這個博客帖子多一點信息:https://blog.newrelic.com/2014/11/13/weird-ruby-begin-end/

1

我覺得你的困惑在於事實begin/endis not considered a block。要使用塊展示你的榜樣,在此我們來看一看:

[3] pry(main)> loop { puts "hi" } while false 
=> nil 
+0

無論實施情況如何,看起來這兩個人的行爲方式看起來幾乎一樣。 – Jamie

+0

你在質疑兩個不同對象的實現,很難不引起注意。 – Anthony

1

做,當確保至少一個執行,但第二個是不是做的同時,是紅寶石的許多sintax糖之一。它相當於

while false 
    puts 'abc' 
end 

只記得

puts 'abc' if false 

兩者都是正確behaviouring。

+0

這並不能解釋爲什麼這些類似的結構行爲不同,儘管 – Jamie

+0

它們看起來很相似,但它們並不相同。第一個是做,而第二個只是爲了方便而在一行中聲明。 –

相關問題