2011-05-19 76 views
52

在CoffeeScript中,該while循環標配:是否有``... while``循環被忽略掉了CoffeeScript ...?

while x() 
    y() 

但是,下面的不起作用:

do 
    y() 
while x() 

而這僅僅是糖的第一個例子:

y() while x() 

CoffeeScript是否帶有至少執行一次的內置循環?

順便說一句,do一個關鍵字 - 它用來調用匿名函數。

+7

OT,但我喜歡'coffeescript'標籤的描述。 :) – 2011-05-19 01:54:01

+0

人們應該問自己,一個給定的構造是否是非常可取的。 'while'和'do ... while'之間的重要區別在於循環體被執行一次,因爲條件僅在循環體執行後被檢查。在CS中,你可以使用'do ... break if ...'或'do ... break'輕鬆地做到這一點,除非......'結構清晰地讀取&*更靈活*因爲'break'可以出現在循環體的任何一行上。這也適用於類似的構造,如帕斯卡的「重複......直到」。 – flow 2013-06-20 13:35:42

+0

@flow'do ... break if ...'招致IIFE懲罰 – 2015-07-21 16:56:48

回答

63

的CoffeeScript的文件說:

唯一的低級別的循環,CoffeeScript的提供是while循環。

我不知道一個內置的循環執行至少一次,所以我想選擇是

loop 
    y() 
    break if x() 
+0

+1這就是我所害怕的。一個快速的網絡搜索揭示了幾個博客提到CoffeeScript支持「do-while」循環,但這些博客肯定是錯誤的。 – ClosureCowboy 2011-05-19 02:48:16

+22

請注意,這模擬'do'-'until';你需要'休息',除非'做' - '時間'。 – matyr 2011-09-17 01:37:01

+0

[鏈接到循環文檔](http://coffeescript.org/#loops) – reergymerej 2015-11-03 04:50:52

16

你的猜測是正確的:沒有do-while相當於CoffeeScript的。所以你通常書寫

y() 
y() while x() 

如果你發現自己經常這樣做,你可以定義一個輔助函數:

doWhile = (func, condition) -> 
    func() 
    func() while condition() 
+2

爲什麼在'循環; Y();除非x();'? – Soumya 2014-06-28 03:45:06

+0

好問題。我還沒有看到「循環」在野外非常常用,但這是它最明智的用例。 – 2014-07-01 16:22:29

0

我一直工作在一個項目中,我只是迫使條件在循環結束時評估,然後在開始處終止。

# set the 'do' variable to pass the first time 
do = true 
while do 

    # run your intended code 
    x() 

    # evaluate condition at the end of 
    # the while code block 
    do = condition 

# continue code 

這不是很優雅,但它確實讓你無法爲你的代碼塊定義一個新函數並運行它兩次。通常有一種方法可以對do ... while語句進行編碼,但在那段時間你不能有一個簡單的解決方案。

+16

'do'是CoffeeScript中的保留字。這會讓讀者感到困惑。 – Mitar 2013-04-03 04:09:38

24

我知道這個答案非常古老,但是由於我是通過Google進入這裏的,所以我認爲別人可能也會這樣。

構建一個do ... while循環相當於在CoffeeScript中,我認爲這句法模擬它的最好和最簡單的和非常易讀:

while true 
    # actions here 
    break unless # conditions here 
+6

'while true'可以寫成'loop'(並且更具描述性:你正在構造一個循環,並且它不會像'true'一樣持續) – 1j01 2015-01-27 04:14:08

+2

@ 1j01回顧我同意'loop'是語義上的將近兩年後會更好,但這是一種替代方法,在使用CoffeeScript編寫我的JS幾年之後,它仍然是我的首選方法,可能只是出於某種習慣。 – adrenalin 2015-01-27 11:03:10

+0

........... k :) – 1j01 2015-01-27 19:15:34

1

我發現這可以通過短路條件完成:

flag = y() while not flag? or x()