几年前,函数式编程的复兴正值巅峰,一篇介绍 Scala 中 10 个单行函数式代码的博文在网上走红。很快地,一系列使用其他语言实现这些单行代码的文章也随之出现,比如 Haskell, Ruby, Groovy, Clojure, Python, C#, F#, CoffeeScript。
每篇文章都令人印象深刻的揭示了这些语言中一些出色优秀的编程特征。编程高手们利用这些技巧提高编程速度、改进软件质量,编程初学者能从这些简洁的预防中学到各种编程语言的真谛。本《震惊小伙伴的单行代码系列》将逐一介绍这些各种编程语言单行代码文章,供大家学习参考。
1、让列表中的每个元素都乘以2
(1..10).map { |n| n * 2 }
2、求列表中的所有元素之和
(1..1000).inject { |sum, n| sum + n }
或者使用原生的Symbol#to_proc语法,这种语法出现在Ruby 1.8.7:
(1..1000).inject(&:+)
或者直接传人symbol:
(1..1000).inject(:+)
3、判断一个字符串中是否存在某些词
words = ["scala", "akka", "play framework", "sbt", "typesafe"] tweet = "This is an example tweet talking about scala and sbt." words.any? { |word| tweet.include?(word) }
4、读取文件
file_text = File.read("data.txt") file_lines = File.readlines("data.txt")
按数组读取时每行结尾字符都是 “\n” 换行符,你可以接着使用代码 .map { |str| str.chop }
去掉它们,或者使用下面的替代方法:
File.read("data.txt").split(/\n/)
5、祝你生日快乐!
4.times { |n| puts "Happy Birthday #{n==2 ? "dear Tony" : "to You"}" }
6. 过滤列表中的数值
[49, 58, 76, 82, 88, 90].partition { |n| n > 60 }
7. 获取XML web service数据并分析
require 'open-uri' require 'hpricot' results = Hpricot(open("http://search.twitter.com/search.atom?&q=scala"))
这个例子里需要使用 open-uri 和 hpricot 代码库 (你也可以自己写一个)。代码不多,但Scala里的方法更优秀。
8. 找到列表中最小或最大的一个数字
[14, 35, -7, 46, 98].min [14, 35, -7, 46, 98].max
9. 并行处理
require 'parallel' Parallel.map(lots_of_data) do |chunk| heavy_computation(chunk) end
这跟Scala语言不一样,Ruby里的多核支持不是内置的。它需要使用 parallel 或其它类似的 gem。
10. “Sieve of Eratosthenes”算法
Scala语言里一行代码就能完成,但可读性不好,在Ruby里可以简单的实现,但不是一行代码:
index = 0 while primes[index]**2 <= primes.last prime = primes[index] primes = primes.select { |x| x == prime || x % prime != 0 } index += 1 end p primes
这个例子直接拷贝自 StackOverflow。不是特别简洁,但你可以看明白。
对于这篇文章,你的反应是: