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コードはコンパクトに感じられません。また、最初に値の配列を15より大きい値を含む短い中間配列に変換するため、それほど効率的ではありません。次に、中間配列を取得し、中間の二乗を含む最終配列を生成します。次に、中間配列が破棄されます。したがって、Rubyは計算中にメモリ内に3つの配列を作成します。Pythonでは、入力リストと結果のリストのみが必要です。
Pythonも同様のマップ内包を提供します。
Pythonはタプルをサポートしています。Rubyにはありません。Rubyでは、タプルをシミュレートするために配列を使用する必要があります。
Rubyはswitch / caseステートメントをサポートしています。Pythonではありません。
Rubyは標準のexpr ? val1 : val2
三項演算子をサポートしています。Pythonではできません。
Rubyは単一継承のみをサポートします。複数の継承を模倣する必要がある場合は、モジュールを定義し、ミックスインを使用してモジュールメソッドをクラスにプルできます。Pythonは、モジュールミックスインではなく多重継承をサポートしています。
Pythonは単一行のラムダ関数のみをサポートしています。ラムダ関数の一種/一種であるRubyブロックは、任意に大きくすることができます。このため、Rubyコードは通常、Pythonコードよりも機能的なスタイルで記述されています。たとえば、Rubyでリストをループするには、通常、
collection.each do |value|
...
end
ブロックは、に渡される関数と非常によく似ていますcollection.each
。Pythonで同じことを行う場合は、名前付きの内部関数を定義し、それを各メソッドのコレクションに渡す必要があります(リストがこのメソッドをサポートしている場合)。
def some_operation(value):
...
collection.each(some_operation)
それはあまりうまく流れません。したがって、通常、Pythonでは次の非機能的なアプローチが使用されます。
for value in collection:
...
安全な方法でのリソースの使用は、2つの言語間でかなり異なります。ここでの問題は、リソースを割り当て(ファイルを開く、データベースカーソルを取得するなど)、そのリソースに対して任意の操作を実行し、例外が発生した場合でも安全に閉じたいということです。
Rubyでは、ブロックは非常に使いやすいため(#9を参照)、通常、このパターンは、リソースに対して任意の操作を実行するためのブロックを取得するメソッドとしてコーディングします。
Pythonでは、名前付きの内部関数を作成する必要があるため(#9を参照)、任意のアクションの関数を渡すのは少し不格好です。代わりに、Pythonはwith
安全なリソース処理のためにステートメントを使用します。Pythonオブジェクトを正しくクリーンアップする方法を参照してください。詳細については。