从Python看Ruby

自从大一接触Python,大量使用到现在,已经敢说很熟悉了。

Ruby比起Python,是更脚本的一门语言。有很多人说python不适合大规模的工程,我相信它们不是在拿python跟ruby比。

Ruby糅合了lisp,perl和smalltalk的特点,虽然后两门语言我并没使用过,但参考ruby可看出一点端倪。

至少在一开始,使用Ruby不太可能像python那样为你带来便利。这是由于语法太复杂(体现在语法糖过多);以及库不像python那样丰富。

然而你仍然可以通过使用Ruby获得极大的乐趣,在你看的明白的前提下,它极具美感。

各种最基础的语法

  1. 迭代容器

Python:

for i in list:
  pass

Ruby:

for i in list:
  pass

list.each do |x|
end

仅就这点而言,ruby可以用和python很像的写法,也可以使用后者这种更ruby的形式。

在后面就会看到,ruby中相当多的代码都采取了后面这种形式。

  1. 迭代容器(with index):

    Python:

    for index, i in enumerate(list):
    pass

Ruby:

list.each_with_index do |x, index|
end

enumerate和each_with_index都是自己可以实现的函数。

从个人角度而言,更喜欢后者这种写法,因为它用起自动补全更方便。

  1. 循环10次

    Python:

    for i in range(10):
    pass

Ruby:

10.times do |x|
end

1.upto(10) do |x|
end

在固定循环次数的代码中,ruby比python漂亮地多,而且在代码层面没有引入额外的因素

(一个1..10的list)。

  1. 字符串格式化

    Python:

    “%d %d” % (1,2)
    “{0} is {1}”.format(a, b)

Ruby:

"%d %d" %  [1,2]
"#{a} #{b}"

此处python和ruby都可以采用类似C中sprintf的方式格式化。

同时python提供了类似C#的格式化方式。我很少使用,不是很清楚它比起前一种有何优势。

ruby另外提供的是类似php和perl的语法,使用中感觉更明晰和方便。

  1. 函数返回值

    Python

    def a():
    return x

Ruby:

def a(x)
  x
end

可以看到,Ruby采用了函数式编程语言中常见的,将最后一个求值的表达式作为函数求值结果的形式。

这提供了很大的灵活性,新出现的类C++语言Rust也采取了这种形式。

  1. 正则表达式

    Python:

    import re

    regex = re.compile(r”[Pp]ython”)

    regex.findall(“python2”)

Ruby:

/[Rr]uby/ === "ruby"
/[Rr]uby/ =~ "ruby"

case "ruby"
  when /[Rr]uby/ then 1
  when /ruby/, /Ruby/ then 2
end

a = /ruby/.match("ruby")

继承自perl的风格,ruby的正则表达式是一个内嵌的语法而非通过包导入的字符串处理引擎。

且通过”===”, “=~”等操作符,灵活地完成正则表达式的匹配和处理,比python强出太多。

  1. 字符串匹配

    Python:

    index = “abc”.find(“a”)

    re.findall(r”[Aa]b”, “abc”)

Ruby:

s = "abs"
s["a"]
s[/[aA]b/]

Ruby的风格非常简洁,然而对于第一次接触的人而言有那么点难以理解

  1. Shell命令

    Python:

    import sh
    sh.ls()

    import subprocess
    subprocess.check_output(‘ls -al’.split())

Ruby:

`ls -al`

从这个角度看,ruby能以很类似shell脚本的方式执行命令。

当真的需要定制更复杂的选项时,便可以像python那样以更复杂的方式调用。