看到CoffeeScript,我潸然泪下

虽然我是C语言的忠实fans,连带从心底热爱C语法,虽然我超讨厌Ruby,连带讨厌一切和Ruby沾边的,但CoffeeScript那优雅的语法还是把我征服了,左边那诗一样优美的代码,右边那一坨,额,怎么说呢,屎一样的感觉:

(最好去官网看对比,在博客上看并不是很不明显,官网在此)


后记:刚一接触CoffeeScript确实有很强的冲击力,主要是和JavaScript的对比过于强烈,但在简单的翻了翻CoffeeScript的入门书之后,感觉这种基本采用Ruby式的语法也并不是非常完美,这个问题见仁见智吧,我说说自己觉得不够好的地方:

1.

对匿名函数的处理确实是一大亮点,但CoffeeScript对于小括号的厌恶是不是有点过分了呢?比如函数调用的一种方式竟然是函数名+空格+参数,结果造成了如下情景:

foo = 'Red'

bar = foo +5 #此为注释,正确形式(注意空格)应为 bar = foo + 5

结果出错,加号后面的空格不能忽略,因为foo +5被CoffeeScript解释为foo(+5)

其实函数后面的括弧我真的不讨厌,甚至我觉得这是一个很清晰的标记,能够让我在一堆表达式里一眼看出哪个是函数,为什么要采用空格来调用函数的方式呢?(事实上,CoffeeScript也接受括弧调用的方式,而且估计应该是更加常用),除了制造混乱之外,这种方式的好处并不明显


2.

字符串插值是很实用的,但

foo = 'red'

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;
})();

你可能感兴趣的:(看到CoffeeScript,我潸然泪下)