Ruby'de bloklar vardır; Python yapmaz.
Python'un işlevleri vardır; Ruby yapmaz. Python'da, herhangi bir işlevi veya yöntemi alıp başka bir işleve geçirebilirsiniz. Ruby'de her şey bir yöntemdir ve yöntemler doğrudan aktarılamaz. Bunun yerine, onları geçmek için Proc'lara sarmanız gerekir.
Ruby ve Python, kapanışları destekler, ancak farklı şekillerde. Python'da, başka bir işlevin içinde bir işlev tanımlayabilirsiniz. İç işlevin dış işlevdeki değişkenlere okuma erişimi vardır, ancak yazma erişimi yoktur. Ruby'de, blokları kullanarak kapanışları tanımlarsınız. Kapanışlar, dış kapsamdaki değişkenlere tam okuma ve yazma erişimine sahiptir.
Python, oldukça etkileyici olan liste anlayışlarına sahiptir. Örneğin, bir numara listeniz varsa, yazabilirsiniz
[x*x for x in values if x > 15]
15'ten büyük tüm değerlerin karelerinin yeni bir listesini almak için Ruby'de aşağıdakileri yazmanız gerekir:
values.select {|v| v > 15}.map {|v| v * v}
Ruby kodu kompakt görünmüyor. Ayrıca, değerler dizisini ilk önce 15'ten büyük değerleri içeren daha kısa bir ara diziye dönüştürdüğü için de o kadar verimli değildir. Ardından, ara diziyi alır ve ara ürünlerin karelerini içeren son bir dizi oluşturur. Ara dizi daha sonra atılır. Dolayısıyla, Ruby hesaplama sırasında bellekte 3 dizi ile sonuçlanır; Python yalnızca giriş listesine ve sonuç listeye ihtiyaç duyar.
Python ayrıca benzer harita anlayışları sağlar.
Python tupleları destekler; Ruby yapmaz. Ruby'de tupleları simüle etmek için dizileri kullanmanız gerekir.
Ruby anahtar / durum ifadelerini destekler; Python yapmaz.
Ruby standart expr ? val1 : val2üçlü operatörü destekler ; Python yapmaz.
Ruby yalnızca tek kalıtımı destekler. Birden çok kalıtımı taklit etmeniz gerekiyorsa, modülleri tanımlayabilir ve modül yöntemlerini sınıflara çekmek için karışımları kullanabilirsiniz. Python, modül karışımları yerine çoklu kalıtımı destekler.
Python yalnızca tek satırlı lambda işlevlerini destekler. Bir çeşit lambda işlevi olan Ruby blokları, keyfi olarak büyük olabilir. Bu nedenle, Ruby kodu genellikle Python kodundan daha işlevsel bir tarzda yazılır. Örneğin, Ruby'de bir liste üzerinde döngü yapmak için genellikle
collection.each do |value|
...
end
Blok, aktarılan bir işlev gibi çalışır collection.each. Aynı şeyi Python'da yapacak olsaydınız, adlandırılmış bir iç işlev tanımlamanız ve ardından bunu her yöntemi koleksiyona iletmeniz gerekir (liste bu yöntemi destekliyorsa):
def some_operation(value):
...
collection.each(some_operation)
Bu pek hoş akmıyor. Bu nedenle, tipik olarak aşağıdaki işlevsel olmayan yaklaşım Python'da kullanılacaktır:
for value in collection:
...
Kaynakları güvenli bir şekilde kullanmak iki dil arasında oldukça farklıdır. Burada sorun, bir miktar kaynak ayırmak (bir dosya açmak, bir veritabanı imleci elde etmek, vb.), Üzerinde rastgele bazı işlemler gerçekleştirmek ve ardından bir istisna oluşsa bile onu güvenli bir şekilde kapatmak istemenizdir.
Ruby'de, blokların kullanımı çok kolay olduğundan (bkz. # 9), genellikle bu kalıbı, kaynakta keyfi işlemin gerçekleştirilmesi için bir blok alan bir yöntem olarak kodlarsınız.
Python'da, rastgele eylem için bir işlev aktarmak, adlandırılmış, içsel bir işlev yazmanız gerektiğinden biraz daha zordur (bkz. # 9). Bunun yerine Python, withgüvenli kaynak işleme için bir ifade kullanır . Bkz nasıl doğru bir Python nesne temizlemek mi? daha fazla ayrıntı için.