这是昨天看CoffeeScript的一些想法,欢迎大家拍砖。
由于V2EX没有文字格式相关的设置,所以建议大家可以去原文地址看看:
http://fxck.it/2012/06/04/learn_ruby_write_everything_coffeescript/----
前言
标题模仿的是Java名言:write once, run everywhere.
我真的可谓是百忙之中抽空写这篇文章啊。今天早上考“数字图像处理”时,前面一个女同学一副打死也不给我抄的样子,虽然最终我并没有打死她,可自己却快要气死了。明早要考“软件工程”,在更新了此文后,今晚复习的时间恐怕就所剩无几了。
不得不说,Rails社区目前已经开始在引领Web开发的潮流了,虽说PHP程序员和JSP程序员还有很多活在这个世界上,但被Rails的顶尖技术与思想打败只能说是时间问题。Python的Web开发一直不冷不热的感觉,如果能超过Rails的话我也表示高兴。
Rails周边
数月前看CoffeeScript不胜理解,所以看了看就放弃了。今天在对JS(其实是它所代表的callback函数思想)有了更深理解以及学习了Ruby的情况下,突然看到CoffeeScript便觉得美不胜收,从下午一直看到了现在。只能说,语法跟Ruby简直太像了,所以看起来很快。
在找CoffeeScript的资料时,还发现了与CSS有关的Scss/Sass,与HTML有关的Slim和Haml。对于CoffeeScript和Scss/Sass来说,这两者已经在Rails 3.1的时候随Rails发行,所以我肯定是要学习他们两个的;而Slim与Haml的话,我倾向于学习Slim,原因就是Slim这个名字我喜欢。
Haml官网的示例代码用自己与ERB进行比较;Slim的docs里也出现了’link_to’的字眼;CoffeeScript本来就是Rails社区的一个项目;Sass的话,已经内置于Rails了。他们的理念都相当新颖,且都跟Rails有着千丝万缕的关系,要说这些工具的发展历程没有Rails的作用里面的话,那就太不客观了。
今天先从CoffeeScript说起吧
CoffeeScript
某篇在介绍CoffeeScript的时候,说“好像在用Python写Ruby,但实际上写的是Javascript”。其他的介绍CoffeeScript的文章也说CoffeeScript既像Python又像Ruby。
但我的感觉是:CoffeeScript完全就是Ruby,跟Python没什么关系。之所以这么说,要从CoffeeScript所改进的JS特性来说。
缩进代替大括号
CoffeeScript是用缩进代替了大括号来表示代码层次的,且每行代码也省去了行末的分号。所说用“缩进代替符号来表示层次”是Python推广(不是是否首创)开的,但我认为目前用缩进来表示代码层次已经是各种程序员在写各种语言时候的一种共识与基本素养了,只是不懂由于不规范代码存在等历史原因还是别的原因导致老的语言并没有在编译的时候允许这样做而已。现在的程序员无论写C,JAVA还是Ruby,虽然它们都有表示层次的方法,但都一律会保持风格良好的缩进。而且Sass和Slim还有Haml都以缩进来表示层次结构,说明这一思想已经成为新语言开发的一种共识,所以本人并不认为用缩进代替大括号就说明它的语法类似Python。只能说Python的缩进语法已经流行开了。
List Comprehension
这东西中文叫做“列表解释”,就是类似下面这样的代码:
[i**2 for i in xrange(10)]
这个嘛…只说一句…它来自Haskell…是Python借Haskell的
from Ruby
完全就是Ruby的语法,直接去看吧。会Ruby的话,不用看那些英文,直接看代码就好。
只想说CoffeeScript里面那漂亮的匿名函数语法来自Ruby 1.9。在Ruby 1.9中,写法是:
double = -> x {x * 2}
puts double.call(10) # or double[10]
CoffeeScript里面是:
double = (x) ->
x * 2
console.log(double(10))
老实说,CoffeeScript的这种语法更好看。
遍地都是值
在像上面那样否定了CoffeeScript“来自Python的两大特征”之后,我也不敢说“遍地是值”这个特征是来自Ruby的了。不过这思想确实也不是来自Ruby,函数式语言皆如此。
在CoffeeScript中,while、if、for等语句都有返回值,而且某些返回值还很贴心。给三段代码,大家有兴趣可以探究一下他们运行结果的差异:
console.log i for i in [1..10]
(console.log i) for i in [1..10]
console.log (i for i in [1..10])
在给段while的代码:
num = 10
console.log(num while num-=1)
num = 10
console.log(while num-=1
num
)
在JS中,本来while、if、for等语句都不是表达式的,CoffeeScript在这一点上做得很令人满意。
其他
CoffeeScript让JS的函数可以提供默认值了。
CoffeeScript提供的面向对象语法一定要重点看看,虽然内容很少很少…但不得不说这是对以prototype为对象基础的JS的一大突破。
与 ? 有关的语法可以琢磨琢磨,比如:
solipsism = true if mind? and not world?
speed = 0
speed ?= 15
footprints = yeti ? "bear"
zip = lottery.drawWinner?().address?.zipcode
其他的自己去发现吧,说多了也没人看。
好了,我要开始复习期末了。
有空再写写Slim和Scss/Sass
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/38438
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.