这是我的一些主要区别:
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对象?更多细节。