`
artdialog
  • 浏览: 103995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

10个让朋友对你刮目相看的CoffeeScript单行代码绝技

阅读更多

或许你已经看过了Marcus Kazmierczak的这篇在HN上颇受欢迎的“10个让朋友对你刮目相看的Scala单行代码绝技”了, 尽管我对Scala并不了解(Java也是),但是这看起来还真不错,于是我也有点手痒, 想让我的朋友们也对我刮目相看一小下——不过不是从Java到Scala,我是从Javascript到CoffeeScript, 下面的例子都是基于node.js环境的。

1. 列表中的每项乘2

Marcus的第一个例子演示了map函数,我们可以使用range语法以及一个匿名函数来完成同样的事情:

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

我们还有下面这个更易读的版本:

i * 2 for i in [1..10]  

2. 数列求和

Javascript(以及CoffeeScript扩展)同样有原生的map以及reduce函数:

[1..1000].reduce (t, s) -> t + s  

(reduce == reduceLeft, 还有reduceRight)  

3. 检查字符串是否包含某个单词

这实在是再简单不过了,因为我们有some方法,只要数组中的任何元素满足条件它就会返回true:

wordList = ["coffeescript", "eko", "play framework", "and stuff", "falsy"]  
tweet = "This is an example tweet talking about javascript and stuff."  

wordList.some (word) -> ~tweet.indexOf word  

下面的语句会返回匹配到的单词:

wordList.filter (word) -> ~tweet.indexOf word  

~在CoffeeScript中并不是什么特别的操作符,这里我们使用了一个小技巧,它实际上就是按位取反操作符, 会对数值按位进行取反操作,在上面的例子里它相当于-x-1,这里我们用它来检查数组的下标是否大于-1, 因为-(-1)-1 == 0,会返回false。

4. 读取文件

使用客户端Javascript框架的用户会对下面的代码感到很亲切:

fs.readFile 'data.txt', (err, data) -> fileText = data  

你还可以使用同步版本:

fileText = fs.readFileSync('data.txt').toString()  

不过在node.js中,你只有在程序启动时才可以使用同步版本,其它时间你都应该使用异步版本。

5. 生日快乐

首先,先来一个Scala版本的映射版,不过我对字符串做了一点篡改:

[1..4].map (i) -> console.log "Happy Birthday " + (if i is 3 then "dear Robert" else "to You")  

下面再来一个优化版,这个读起来更像伪代码了:

console.log "Happy Birthday #{if i is 3 then "dear Robert" else "to You"}" for i in [1..4]  

6. 过滤数列

将一个数字序列过滤为两种类型,这已经很接近了:

passed = []  
failed = []  
(if score > 60 then passed else failed).push score for score in [49, 58, 76, 82, 88, 90]  

(也可以使用filter,但是那样就不是一行了。。。)

7. 读取并解析一个XML Web service

XML是个神马东东?从没听过,让我们把它换成json,你可以使用request库:

request.get { uri:'path/to/api.json', json: true }, (err, r, body) -> results = body  

8. 找到一个数列的最小(最大)值

我们有非常棒的apply函数,它可以让你通过一个数组来调用拥有可变参数的函数:Math.max以及Math.min, 这两个函数都接受可变长度参数,比如Math.max 30, 10, 20返回30,让我们试试下面的代码:

Math.max.apply @, [14, 35, -7, 46, 98] # 98  
Math.min.apply @, [14, 35, -7, 46, 98] # -7  

9. 并行处理

这个还不行,你可以创建子进程并自己和它们进行通讯, 或者使用WebWorkers API实现,让我们跳过这个。

10. 埃拉托斯特尼筛法

(译者注:埃拉托斯特尼筛法是古希腊数学家埃拉托斯特尼所提出的一种简单的判定素数的算法,详细介绍请参见维基百科)

一行可以搞定?

sieve = (num) ->  
    numbers = [2..num]  
    while ((pos = numbers[0]) * pos) <= num  
        delete numbers[i] for n, i in numbers by pos  
        numbers.shift()  
    numbers.indexOf(num) > -1  

更新 (06/05): @dionyziz 发给了我这个更简洁的版本:

primes = []  
primes.push i for i in [2..100] when not (j for j in primes when i % j == 0).length  

现在我们可以像原始版一样用一行来完成判定了:

(n) -> (p.push i for i in [2..n] when not (j for j in (p or p=[]) when i%j == 0)[0]) and n in p  

或者是下面这样:

(n) -> (p.push i for i in [2..n] when !(p or p=[]).some((j) -> i%j is 0)) and n in p  

11. 奖励

最后,再奖励你们一个你肯定没见过的最易读的fizzbuzz(数3,数5游戏)版本:

"#{if i%3 is 0 then 'fizz' else ''}#{if i%5 is 0 then 'buzz' else ''}" or i for i in [1..100]  

更新:基于satyr的提示,这里是一个更简单,也更取巧的版本:

['fizz' unless i%3] + ['buzz' unless i%5] or i for i in [1..100]  

如果你对数组使用+操作符,它会变成一个字符串,当数组中包含undefined或是null时,[].toString()和[].join(',')是一个效果,这在Javascript中也同样有效([undefined] + "b" === "b")

结论

我很吃惊这些例子中的一些语法居然和Scala如此接近,而我原以为它应该是属于另外一个星球的编程语言。

你可以在这里了解更多关于CoffeeScript的知识, 以及代码片段, 也欢迎在Twitter上Follow @ricardobeat.

22
28
分享到:
评论
7 楼 tlde_ti 2012-07-27  
现在的转帖都不标注原帖了。
本来打了一串回复,现在也不想贴了。

搜索了下,原题地址是
http://heikezhi.com/2011/06/08/10-coffeescript-one-liners-to-impress-your-friends/
6 楼 artdialog 2012-07-27  
nodejs 写道
justjavac 写道
看到单行代码我就兴奋。

看到coffeescript我就兴奋。

看到单行代码的coffeescript我就兴奋。记得以前看过单行的lua,感觉很酷,还有单行的perl。没想到js也可以,不过得借助coffeescript。
5 楼 artdialog 2012-07-27  
justjavac 写道
justcss 写道
一个字 - 优雅。

呵呵。『优雅』是10个字。

世界上只有10种人,一种懂二进制,一种不懂二进制
4 楼 justjavac 2012-07-27  
justcss 写道
一个字 - 优雅。

呵呵。『优雅』是10个字。
3 楼 justcss 2012-07-27  
一个字 - 优雅。
2 楼 nodejs 2012-07-27  
justjavac 写道
看到单行代码我就兴奋。

看到coffeescript我就兴奋。
1 楼 justjavac 2012-07-27  
看到单行代码我就兴奋。

相关推荐

    CoffeeScript in Action

    CoffeeScript 还提供了一个机会, 让你现在就可以使用 ECMAScript 里面的特性. 将来有个更多新特性, CoffeeScript 也有机会在浏览器支持之前实现它们. 程序员面对的是 CoffeeScript 的优雅接口, 它是程序员和...

    Coffeescript中文手册

    函数调用 10 函数上下文 11 对象字面量与数组定义 11 流程控制 12 字符串插值法 14 循环和列表解析 14 数组 15 别名和存在操作符 16 类 17 实例属性 18 静态变量 19 继承与Super 20 Mixins 21 扩展类 22 ...

    CoffeeScript 中文

    CoffeeScript 中文文档 详细说明了CoffeeScript的语法和与JavaScript同样的实现

    CoffeeScript速查表

    CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. CoffeeScript 尝试用简洁的方式展示 JavaScript 优秀的部分.

    一个超级简单的基于 JS 的 libretro 前端_CoffeeScript_代码_下载

    游戏时间玩家 一个超级简单的基于 JavaScript 的 libretro 前端。

    coffeescript-java.zip

    coffeescript-java 是一个简单的 Java 类用来将 CoffeeScript 脚本转成 JavaScript 脚本。程序直接利用 Java 的脚本引擎来实现。 标签:coffeescript

    Smooth CoffeeScript Web Optimized

    公认的学习coffeescript 比较好的入门书籍,讲得很详细。

    coffeescript

    coffee script.pdf: coffee script book

    临床质量测量测试工具_CoffeeScript_代码_相关文件_下载

    然后,开发人员可以使用度量元数据,根据度量构建过程中定义的临床元素为度量构建一个综合的患者测试平台。通过使用测量元数据作为构建合成患者的基础,开发人员可以快速有效地为测量创建测试平台。Bonnie 应用程序...

    CoffeeScript.Application.Development.Cookbook.1783289694

    Over 90 hands-on recipes to help you develop engaging applications using CoffeeScript About This Book Use CoffeeScript to create and test applications and backend services Build applications using ...

    CoffeeScript-Application-Development-Cookbook

    CoffeeScript 还提供了一个机会, 让你现在就可以使用 ECMAScript 里面的特性. 将来有个更多新特性, CoffeeScript 也有机会在浏览器支持之前实现它们. 程序员面对的是 CoffeeScript 的优雅接口, 它是程序员和...

    CoffeeScript Application Development Cookbook(PACKT,2015)

    CoffeeScript is a JavaScript compiler. CoffeeScript brings many things to the table that are lacking in JavaScript itself. This includes a class and module system, a syntax that is cleaner, less terse...

    [CoffeeScript] CoffeeScript 编程 口袋书 (英文版)

    [Addison-Wesley Professional] CoffeeScript 编程 口袋书 (英文版) [Addison-Wesley Professional] The Little Book on CoffeeScript (E-Book) ☆ 出版信息:☆ [作者信息] Alex MacCaw [出版机构] Addison-...

    CoffeeScript小书

    CoffeeScript小书,很简单新手入门书籍

    ibrik:CoffeeScript遇到伊斯坦布尔-CoffeeScript的代码覆盖率工具

    ( )是CoffeeScript的代码覆盖工具。 它使用和CoffeeScript sourceMaps。 在内部,它使用Mozilla JS AST作为其IR。 安装 ibrik可以通过包管理器在Node.js应用程序中使用: npm install -g ibrik 用法 像这样 ...

    programming in coffeescript

    CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good ...

    用于微控制器和嵌入式 的实时数据流编程_CoffeeScript_代码_相关文件_下载

    与大多数其他受限设备的数据流运行时不同,MicroFlo在微控制器上独立运行,可以在运行时进行自省和重新配置,并内置对自动化测试的支持。 可以使用 MicroFlo 编程: 视觉上,使用Flowhub 在文本上,使用声明性.fbp...

    coffeescript programming with jquery rails and node.js

    CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good ...

Global site tag (gtag.js) - Google Analytics