`
artdialog
  • 浏览: 105197 次
  • 性别: 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

    CoffeeScript是一种优雅的编程语言,旨在让开发者以更轻松、更有趣的方式编写JavaScript代码。它是一种小型的、可编译成JavaScript的语言,被设计为能运行在任何JavaScript可以运行的环境中。CoffeeScript的主要目的...

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

    Libretro 是一个开源框架,它允许开发者创建和使用各种复古游戏模拟器,...通过深入研究和修改代码,你可以了解如何创建自己的 web-based 模拟器前端,这不仅对游戏爱好者,对希望提升前端开发技能的开发者也极具价值。

    Coffeescript中文手册

    CoffeeScript 是一种简洁、优雅的编程语言,它旨在简化JavaScript的编写,提供更易读、易写的代码。通过CoffeeScript编写的代码会被自动编译成JavaScript,因此可以在任何支持JavaScript的环境中运行。以下是对标题...

    CoffeeScript:简化JavaScript代码的优雅选择

    CoffeeScript的设计初衷是简化JavaScript代码,提高开发效率和代码可读性。本文将深入探讨CoffeeScript的主要特点,并通过实际代码示例,展示其在简化JavaScript代码中的应用。 CoffeeScript通过提供更简洁的语法和...

    CoffeeScript小书1

    CoffeeScript是一种简洁、优雅的编程语言,它设计的目的是为了简化JavaScript的编写,减少冗余代码,提高代码的可读性和可维护性。CoffeeScript的语法受到Ruby和Python的影响,提供了一系列特性,如列表解析、原型...

    CoffeeScript 中文

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

    CoffeeScript速查表

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

    Node.js-基于Koa2-CoffeeScript-PostgreSQL的服务器开发示例

    在本示例中,我们将深入探讨如何使用Node.js的Koa2框架,CoffeeScript编程语言以及PostgreSQL数据库来构建一个服务器。Koa2是Node.js社区广泛使用的Web应用框架,它由Express.js的作者创建,旨在提供更轻量级、模块...

    coffeescript-java.zip

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

    做web前端的同志们,想用coffeescript吗?苦于自己的web框架不支持?没关系!

    对于那些对JavaScript语法感到困扰或者想要尝试不同编程体验的前端开发者来说,Coffeescript是一个值得探索的选择。 描述部分提到“苦于自己的web框架不支持?”这暗示了文章可能涉及如何在现有的Web框架中集成或...

    CoffeeScript - Accelerated JavaScript Development

    - **David Heinemeier Hansson(Rails创始人)**:他认为CoffeeScript让JavaScript变得更加有趣,更容易编写和阅读。 - **Scott Leberknight(Near Infinity首席架构师)**:他指出CoffeeScript直接切中要点,展示了...

    coffeescript 入门教程

    例如,可以使用 `for...in` 循环来遍历数组,并且可以轻松地写成一行代码,像 `lunch=(eat food for food in ['toast', 'cheese', 'wine'])` 这样的语句将遍历数组,并对每个元素应用 `eat` 函数。 5. CoffeeScript...

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

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

Global site tag (gtag.js) - Google Analytics