Ruby有块;Python没有。
Python具有功能;Ruby没有。在Python中,您可以采用任何函数或方法并将其传递给另一个函数。在Ruby中,一切都是方法,不能直接传递方法。相反,您必须将它们包装在Proc中才能通过。
Ruby和Python都支持闭包,但是方式不同。在Python中,您可以在另一个函数中定义一个函数。内部函数对外部函数的变量具有读访问权限,但对写函数没有访问权限。在Ruby中,您可以使用块定义闭包。闭包对外部作用域的变量具有完全的读取和写入访问权限。
Python具有列表表达能力,非常具有表现力。例如,如果您有一个数字列表,则可以写
[x*x for x in values if x > 15]
要获得所有大于15的平方的新列表,在Ruby中,您必须编写以下代码:
values.select {|v| v > 15}.map {|v| v * v}
Ruby代码并不那么紧凑。由于它首先将values数组转换为包含值大于15的较短的中间数组,因此效率也不高。然后,它获取中间数组并生成包含中间平方的最终数组。然后将中间数组扔掉。因此,Ruby在计算过程中最终在内存中存储了3个数组。Python仅需要输入列表和结果列表。
Python还提供了类似的地图理解。
Python支持元组;露比没有 在Ruby中,您必须使用数组来模拟元组。
Ruby支持switch / case语句;Python没有。
Ruby支持标准的expr ? val1 : val2
三元运算符。Python没有。
Ruby仅支持单继承。如果您需要模拟多重继承,则可以定义模块并使用混入将模块方法拉入类。Python支持多重继承,而不是模块混合。
Python仅支持单行lambda函数。Ruby块是lambda函数的一种/种类,可以任意大。因此,Ruby代码通常以比Python代码更实用的方式编写。例如,要遍历Ruby中的列表,通常
collection.each do |value|
...
end
该块的工作原理非常类似于传递给的函数collection.each
。如果要在Python中执行相同的操作,则必须定义一个命名的内部函数,然后将其传递给每个方法的集合(如果列表支持此方法):
def some_operation(value):
...
collection.each(some_operation)
那不是很好。因此,通常在Python中使用以下非功能性方法:
for value in collection:
...
两种语言之间以安全的方式使用资源是完全不同的。在这里,问题在于您想要分配一些资源(打开文件,获取数据库游标等),对其进行一些任意操作,然后即使发生异常也以安全的方式关闭它。
在Ruby中,由于块非常易于使用(请参阅#9),因此通常将这种模式编码为一种方法,该方法采用块来对资源执行任意操作。
在Python中,为任意动作传递函数会比较麻烦,因为您必须编写一个命名的内部函数(请参阅#9)。相反,Python使用with
语句来安全地处理资源。请参阅如何正确清理Python对象?更多细节。