看到CoffeeScript,我潸然淚下

雖然我是C語言的忠實fans,連帶從心底熱愛C語法,雖然我超討厭Ruby,連帶討厭一切和Ruby沾邊的,但CoffeeScript那優雅的語法仍是把我征服了,左邊那詩同樣優美的代碼,右邊那一坨,額,怎麼說呢,屎同樣的感受:php

(最好去官網看對比,在博客上看並非很不明顯,官網在此函數


後記:剛一接觸CoffeeScript確實有很強的衝擊力,主要是和JavaScript的對比過於強烈,但在簡單的翻了翻CoffeeScript的入門書以後,感受這種基本採用Ruby式的語法也並非很是完美,這個問題見仁見智吧,我說說本身以爲不夠好的地方:spa

1.

對匿名函數的處理確實是一大亮點,但CoffeeScript對於小括號的厭惡是否是有點過度了呢?好比函數調用的一種方式居然是函數名+空格+參數,結果形成了以下情景:coffeescript

foo = 'Red'ip

bar = foo +5 #此爲註釋,正確形式(注意空格)應爲 bar = foo + 5
字符串

結果出錯,加號後面的空格不能忽略,由於foo +5被CoffeeScript解釋爲foo(+5)get

其實函數後面的括弧我真的不討厭,甚至我以爲這是一個很清晰的標記,可以讓我在一堆表達式裏一眼看出哪一個是函數,爲何要採用空格來調用函數的方式呢?(事實上,CoffeeScript也接受括弧調用的方式,並且估計應該是更加經常使用),除了製造混亂以外,這種方式的好處並不明顯博客


2.

字符串插值是很實用的,但it

foo = 'red'io

bar = "color is #{foo}"

這裏面的#看着好刺眼,js和php的不少模板都使用,bar = "color is {{foo}}"這種方式我以爲比Ruby的這種順眼一些。




這是CoffeeScript的代碼:

# Assignment:
number   = 42
opposite = true

# Conditions:
number = -42 if opposite

# Functions:
square = (x) -> x * x

# Arrays:
list = [1, 2, 3, 4, 5]

# Objects:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x

# Splats:
race = (winner, runners...) ->
  print winner, runners

# Existence:
alert "I knew it!" if elvis?

# Array comprehensions:

cubes = (math.cube num for num in list)


做爲對比,這是JavaScript的代碼:


var cubes, list, math, num, number, opposite, race, square,  __slice = [].slice;number = 42;opposite = true;if (opposite) {  number = -42;}square = function(x) {  return x * x;};list = [1, 2, 3, 4, 5];math = {  root: Math.sqrt,  square: square,  cube: function(x) {    return x * square(x);  }};race = function() {  var runners, winner;  winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];  return print(winner, runners);};if (typeof elvis !== "undefined" && elvis !== null) {  alert("I knew it!");}cubes = (function() {  var _i, _len, _results;  _results = [];  for (_i = 0, _len = list.length; _i < _len; _i++) {    num = list[_i];    _results.push(math.cube(num));  }  return _results;})();

相關文章
相關標籤/搜索