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

相关文章
相关标签/搜索