Ruby memiliki blok; Python tidak.
Python memiliki fungsi; Ruby tidak. Dengan Python, Anda bisa mengambil fungsi atau metode apa saja dan meneruskannya ke fungsi lain. Di Ruby, semuanya adalah metode, dan metode tidak dapat diteruskan secara langsung. Sebagai gantinya, Anda harus membungkusnya dengan Proc untuk melewatinya.
Ruby dan Python keduanya mendukung penutupan, tetapi dengan cara yang berbeda. Dengan Python, Anda bisa mendefinisikan fungsi di dalam fungsi lain. Fungsi dalam memiliki akses baca ke variabel dari fungsi luar, tetapi tidak akses tulis. Di Ruby, Anda menentukan penutupan menggunakan blok. Penutupan memiliki akses baca dan tulis penuh ke variabel dari lingkup luar.
Python memiliki daftar pemahaman, yang cukup ekspresif. Misalnya, jika Anda memiliki daftar angka, Anda dapat menulis
[x*x for x in values if x > 15]
untuk mendapatkan daftar kuadrat baru dari semua nilai yang lebih besar dari 15. Di Ruby, Anda harus menulis yang berikut:
values.select {|v| v > 15}.map {|v| v * v}
Kode Ruby tidak terasa kompak. Ini juga tidak seefisien karena pertama-tama mengubah array nilai menjadi array menengah yang lebih pendek yang mengandung nilai lebih besar dari 15. Kemudian, dibutuhkan array perantara dan menghasilkan array akhir yang berisi kotak-kotak perantara. Array perantara kemudian dibuang. Jadi, Ruby berakhir dengan 3 array dalam memori selama perhitungan; Python hanya membutuhkan daftar input dan daftar yang dihasilkan.
Python juga menyediakan pemahaman peta yang serupa.
Python mendukung tuple; Ruby tidak. Di Ruby, Anda harus menggunakan array untuk mensimulasikan tupel.
Ruby mendukung pernyataan switch / case; Python tidak.
Ruby mendukung expr ? val1 : val2operator ternary standar ; Python tidak.
Ruby hanya mendukung satu warisan. Jika Anda perlu meniru banyak pewarisan, Anda dapat mendefinisikan modul dan menggunakan campuran untuk menarik metode modul ke dalam kelas. Python mendukung multiple inheritance daripada module mix-in.
Python hanya mendukung fungsi lambda satu baris. Blok Ruby, yang merupakan jenis / semacam fungsi lambda, bisa sangat besar. Karena itu, kode Ruby biasanya ditulis dalam gaya yang lebih fungsional daripada kode Python. Misalnya, untuk mengulang daftar di Ruby, biasanya Anda lakukan
collection.each do |value|
...
end
Blok bekerja sangat mirip dengan fungsi yang diteruskan collection.each. Jika Anda melakukan hal yang sama dengan Python, Anda harus mendefinisikan fungsi dalam bernama dan kemudian meneruskannya ke kumpulan setiap metode (jika daftar mendukung metode ini):
def some_operation(value):
...
collection.each(some_operation)
Itu tidak mengalir dengan sangat baik. Jadi, biasanya pendekatan non-fungsional berikut akan digunakan dalam Python:
for value in collection:
...
Menggunakan sumber daya dengan cara yang aman sangat berbeda antara kedua bahasa. Di sini, masalahnya adalah Anda ingin mengalokasikan beberapa sumber daya (membuka file, mendapatkan kursor database, dll), melakukan beberapa operasi sewenang-wenang di atasnya, dan kemudian menutupnya dengan cara yang aman bahkan jika pengecualian terjadi.
Di Ruby, karena blok sangat mudah digunakan (lihat # 9), Anda biasanya akan mengkode pola ini sebagai metode yang mengambil blok untuk operasi sewenang-wenang untuk dilakukan pada sumber daya.
Dalam Python, mengirimkan fungsi untuk tindakan arbitrer sedikit clunkier karena Anda harus menulis nama, fungsi bagian dalam (lihat # 9). Sebagai gantinya, Python menggunakan withpernyataan untuk penanganan sumber daya yang aman. Lihat Bagaimana cara membersihkan objek Python dengan benar? untuk lebih jelasnya.