10个惊艳的 CoffeeScript 单行代码

简介:

10个惊艳的 CoffeeScript 单行代码


你可能已经读过Marcus Kazmierczak博客中的《10 Scala One Liners to Impress Your Friends》。虽然我不懂Scala(以及Java),但是它看上去真心不错,所以我决定也要惊艳我的朋友一番——人家从Java到Scala,我从Javascript到CoffeeScript。假设所有例子使用node.js作为环境。

【译者注】:译者对CoffeeScript不太了解,只是觉得这种单行代码还挺有艺术感的,于是粗糙地翻译出来分享给大家,有不对的地方还请指出来: )

1.数组中的每个元素乘以2

Marcus从炫耀 map 函数开始。我们可以使用字面范围和匿名函数做到完全相同的事情:

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

更多表现形式

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

2.数组中的元素求和

Javascript(以及CoffeeScript的扩展),也有本地map和reduce函数:

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

(reduce == reduceLeftreduceRight 也可)

3.验证word在字符串中是否存在

非常容易,因为方法不止一种。如果数组中的任何元素满足函数的话就返回true:

 
 
  1. wordList = ["coffeescript", "eko", "play framework", "and stuff", "falsy"]
  2. tweet = "This is an example tweet talking about javascript and stuff."
  3. wordList.some (word) -> ~tweet.indexOf word

返回匹配的word:

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

~ 在CoffeeScript中不是一个特殊的运算符,只是一个鬼把戏而已。它是一个按位取非运算符,即反转操作数的二进制数字。在实践中它相当于-X-1。这里它的工作原理是检查索引是否大于-1,并且 – ( – 1)-1 == 0计算为false。

4.读取文件

JavaScript框架的客户端用户熟悉这个一种思路:

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

你也可以使用同步版本:

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

在Node.js中,这仅接受应用程序的启动程序。你应该在你的代码中使用异步版本。

5.生日快乐

首先,输出一个1对1的映射集合,并在中间混合插入一小段字符串:

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

但这样更好。读起来像伪代码:

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

6.过滤数组中的数字

过滤数组中的数字分为两类。有文化的方式:

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

(感谢@giacecco帮助缩短了此处的代码)

以及函数式方法:

 
 
  1. [passed, failed] = [49, 58, 76, 82, 88, 90].reduce ((p,c,i) -> p[+(c < 60)].push c; p), [[],[]]

7.获取并解析一个XML Web服务

XML是什么?不曾听说过。那么不妨使用requst库获取JSON:

 
 
  1. 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。放到数组中:

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

9.并行处理

我还没有想到。你可以自己创建子进程,并与它们沟通,或者使用WebWorkers API实现。跳过。

10.埃拉托斯特尼筛法

无法把它减缩到一行代码。思路是这样的?

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

更新(6月/5日):@dionyziz发给我这个精简版本:

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

然后我们可以使用到真正的单行代码,就像原来的那个一样:

 
 
  1. (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

或在某种程度上更高效

 
 
  1. (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版本,你可以看到:

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

编辑:通过一个小提示使之更简单,但更有技巧:

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

当你在数组中使用 + 运算符时,它会转换为字符串。[].toString()[].join(',')相同,它在数组值undefinednull情况下,给出一个空的字符串。这也适用于Javascript([undefined] + "b" === "b")。

结论

现代编程语言的表达令人惊讶。同样我令我惊讶的是,这些映射中的一些语法是如此相似于Scala,但这两种语言却远隔万水千山。




本文来自云栖社区合作伙伴“Linux中国”

原文发布时间为:2013-04-02.


相关文章
|
JavaScript 前端开发
学习JavaScript笔记
学习JavaScript笔记
35 0
|
JavaScript 前端开发
Javascript 学习 笔记六
1、javascript 面向对象 &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt; &lt;html xmlns="http://www.w3.org/1999/xht
1021 0
|
JavaScript 前端开发 算法
Javascript 学习 笔记三
1、Javascript 组成: ECMAScript--JavaScript的核心,描述了语言的基本语法和对象。DOM(文档对象模型)--The Document Object Model描述了作用于网页内容的方法和接口。document的操作,比如: var lis = document.getElementsByTagName('li'); BOM(浏览器对象模型):The Brow
1051 0
|
6天前
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
6天前
|
关系型数据库 分布式数据库 数据库
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
PolarDB分布式版助力《香肠派对》实现百亿好友关系20万QPS的毫秒级查询。
PolarDB闪电助攻,《香肠派对》百亿好友关系实现毫秒级查询
|
7天前
|
消息中间件 Cloud Native Serverless
RocketMQ 事件驱动:云时代的事件驱动有啥不同?
本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。
115049 1
|
8天前
|
弹性计算 安全 API
访问控制(RAM)|云上安全使用AccessKey的最佳实践
集中管控AK/SK的生命周期,可以极大降低AK/SK管理和使用成本,同时通过加密和轮转的方式,保证AK/SK的安全使用,本次分享为您介绍产品原理,以及具体的使用步骤。
101814 1
|
7天前
|
自然语言处理 Cloud Native Serverless
通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验
近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中,无需再次登录即可使用通义灵码的智能编程能力,实现开发效率与代码质量的双重提升。
95389 2
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
112734 12
|
12天前
|
SQL 存储 JSON
Flink+Paimon+Hologres 构建实时湖仓数据分析
本文整理自阿里云高级专家喻良,在 Flink Forward Asia 2023 主会场的分享。
71322 1
Flink+Paimon+Hologres 构建实时湖仓数据分析

热门文章

最新文章