<p>以下是一些关键的区别:</p>
<ol>
<li><p>Ruby有块;Python没有。</p></li>
<li><p>Python有函数,而Ruby没有。在Python中,可以接受任何函数或方法并将其传递给另一个函数。在Ruby中,一切都是一个方法,不能直接传递方法。相反,你必须把它们包装在过程中才能通过。</p></li>
<li><p>Ruby和Python都支持闭包,但方式不同。在Python中,可以在另一个函数中定义函数。内部函数具有对外部函数变量的读取访问权限,但不具有写入访问权限。在Ruby中,使用块定义闭包。闭包对外部作用域中的变量具有完全的读写访问权限。</p></li>
<li><p>Python有列表理解,非常有表现力。例如,如果你有一个数字列表,你可以写</p>
<pre><code>[x*x for x in values if x > 15]
</code></pre>
<p>获取大于15的所有值的平方的新列表。在Ruby中,您必须编写以下内容:</p>
<pre><code>values.select {|v| v > 15}.map {|v| v * v}
</code></pre>
<p>Ruby代码没有那么紧凑。它的效率也不高,因为它首先将values数组转换为包含大于15的值的较短的中间数组。然后,取中间数组,生成一个包含中间数组平方的最终数组。然后抛出中间数组。因此,Ruby在计算过程中最终在内存中有3个数组;Python只需要输入列表和结果列表。</p>
<p>Python还提供类似的映射理解。</p></li>
<li><p>Python支持元组,而Ruby不支持元组。在Ruby中,必须使用数组来模拟元组。</p></li>
<li><p>Ruby支持switch/case语句;Python不支持。</p></li>
<li><p>Ruby支持标准的三元运算符;Python不支持。</del></p></li>
<li><p>Ruby只支持单一继承。如果需要模拟多重继承,可以定义模块并使用mix-ins将模块方法拉入类。Python支持多重继承,而不是模块混合。</p></li>
<li><p>Python只支持单行lambda函数。Ruby块是一种lambda函数,可以任意大。因此,Ruby代码通常是以比Python代码更实用的风格编写的。例如,要在Ruby中循环一个列表,通常需要</p>
<pre><code>collection.each do |value|
...
end
</code></pre>
<p>块的工作方式非常类似于传递给<code>collection.each</code>的函数。如果要在Python中执行相同的操作,则必须定义一个命名的内部函数,然后将其传递给每个方法的集合(如果list支持此方法):</p>
<pre><code>def some_operation(value):
...
collection.each(some_operation)
</code></pre>
<p>这不是很好的流动。因此,Python通常使用以下非功能性方法:</p>
<pre><code>for value in collection:
...
</code></pre></li>
<li><p>以安全的方式使用资源在这两种语言中是完全不同的。这里的问题是,您希望分配一些资源(打开文件、获取数据库游标等),对其执行一些任意操作,然后以安全的方式关闭它,即使发生异常。</p>
<p>在Ruby中,由于块非常容易使用(请参见#9),您通常将此模式编码为一个方法,该方法接受一个块,以便对资源执行任意操作。</p>
<p>在Python中,为任意操作传入一个函数要复杂一些,因为必须编写一个命名的内部函数(请参见#9)。相反,Python使用<code>with</code>语句来安全地处理资源。有关详细信息,请参见<a href="https://stackoverflow.com/questions/865115/how-do-i-correctly-clean-up-a-python-object/865272#865272">How do I correctly clean up a Python object?</a>。</p></li>
</ol>