高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

CoffeeScript 基本篇(二)

邏輯判斷

其實就是if..else那類的事,沒什麼特別的。不過在CoffeeScript裡有幾個比較有趣的點:

  • 不需要特別寫then:除非是寫成一行,不然不需要特別加上”then”
  • 有unless可以用:unless就是not if,if就是not unless,也許你會覺得有if not了何必需要unless呢? 其實每個人對語意的理解都有些差別,有的人覺得”除非怎樣怎樣”比較通順,有的人覺得”如果不要怎樣怎樣..”比較通順,其實指的都是同一件事,隨個人喜好。
  • if後面的判斷句如果在不影響語意的情況下,可以不需要小括號,例如:
1
2
if age > 18
  console.log "Yes, You are Adult"
  • 如果if / unless接的內容只有一行的話,if / unless 可以像一般英文敘述句一樣,放到最後面,例如:
1
console.log "Yes, You are Adult" if age > 18

為什麼要放到後面? 有什麼好處? 通常把if丟後面去,除了縮短一行的行數、程式碼讀起來更像一般口語之外,以上面這個例子來說,會有特別”強調”或”希望它執行”前面那個動詞的意味(個人觀感)。 * 在比大小的時候,跟Python借來的大於、小於用法,讓語法更清楚,例如:

1
2
body_weight = 70
normal_body_weight = 65 < body_weight < 80

有if..else,當多個if..else判斷串在一起的時候,CoffeeScript也有switch可以用:

1
2
3
4
5
6
switch username
  when "eddie" then console.log "You are  the King"
  when "nayumi"
      console.log "Yes, My Lord.."
      console.log "You are the Queen"
  else console.log "You are nobody"

編譯結果:

1
2
3
4
5
6
7
8
9
10
11
switch (username) {
  case "eddie":
      console.log("You are  the King");
      break;
  case "nayumi":
      console.log("Yes, My Load..");
      console.log("You are the Queen");
      break;
  default:
      console.log("You are nobody");
}

要注意的是,跟if..else一樣,如果是單行敘述,when後面請加上then,否則不需要加。話說還好這點像Ruby不像Python,Python並沒有switch之類的可以用,這並沒不好,只是我還是覺得有switch之類的語法可以讓程式碼變得比較清楚,純個人喜好。

迴圈

CoffeeScript裡的迴圈跟一般的程式語言沒什麼太大的差別,就差不多是那麼一回事。前面提到的Range,常會放在迴圈裡面來使用:

1
2
3
4
console.log i for i in [1..10]                  # 印出1到10
console.log i for i in [1..10] when i % 2 == 0  # 印出2, 4, 6, 8, 10
console.log i for i in [1..10] by 2             # 一次跳2,印出1, 3, 5, 7, 9
console.log i * 2 for i in [1..10]              # 對每個i值 x 2

還有類似Ruby的陣列操作:

1
[1..10].map (i) -> console.log i*2

編譯結果:

1
2
3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(i) {
  return console.log(i * 2);
});

跟if/unless一樣,while也有他的死對頭until (while = not until, until = not while),如果while / until的敘述句只有一行的話,同樣也可以放到句子的最後面。

1
console.log "Keep Walking" while miles < 100

編譯結果:

1
2
3
while (miles < 100) {
  console.log("Keep Walking");
}

語法糖衣

為了讓程式碼看起來更像一般的英文敘述句,在CoffeeScript裡特別做了一些alias,例如幫true值做了兩組alias:on以及yes,相對的,off跟no就是false的同義詞,其它的還有:

is    =>  ===
isnt  =>  !==
and   =>  &&
or    =>  ||
not   =>  !

所以,你可能可以寫出這樣的程式碼:

1
2
3
4
5
6
7
8
if light is off
  console.log "I can't see anything"

if eddie isnt handsome
  console.log "It's impossible!"

if girl is not single
  console.log "Don't Touch! Be Careful!"

編譯結果:

1
2
3
4
5
6
7
8
9
10
11
if (light === false) {
  console.log("I can't see anything");
}

if (eddie !== handsome) {
  console.log("It's impossible!");
}

if (girl === !single) {
  console.log("Don't Touch! Be Careful!");
}

這樣一來,程式碼看起來就更口語化了。

最後來看一下這個好用的問號:

1
age ?= 18

這個的意思是說,如果age這個變數還沒被定義或給值的話,就給這個變數設定為18。簡單的說,就是給預設值啦,所以上面這一行會被編譯成:

1
2
3
4
5
if (typeof age !== "undefined" && age !== null) {
  age;
} else {
  age = 18;
};

真的是相當方便啊!!

更多精彩內容,請參考CoffeeScript官網上文件。

Comments