Mungkin ada dua perbedaan utama:
Ruby memiliki penutupan anonim yang elegan.
Rails menggunakannya untuk efek yang baik. Berikut contohnya:
class WeblogController < ActionController::Base
def index
@posts = Post.find :all
respond_to do |format|
format.html
format.xml { render :xml => @posts.to_xml }
format.rss { render :action => "feed.rxml" }
end
end
end
Penutupan / lambda anonim membuatnya lebih mudah untuk meniru fitur bahasa baru yang akan mengambil blok. Di Python, closure ada, tapi harus diberi nama agar bisa digunakan. Jadi, alih-alih dapat menggunakan closure untuk meniru fitur bahasa baru, Anda dipaksa untuk menjelaskan fakta bahwa Anda menggunakan closure.
Ruby memiliki metaprogramming yang lebih bersih dan lebih mudah digunakan.
Ini digunakan secara ekstensif di Rails, terutama karena betapa mudahnya digunakan. Untuk lebih spesifiknya, di Ruby, Anda dapat mengeksekusi kode arbitrer dalam konteks kelas. Cuplikan berikut ini setara:
class Foo
def self.make_hello_method
class_eval do
def hello
puts "HELLO"
end
end
end
end
class Bar < Foo
make_hello_method
end
class Bar < Foo; end
Bar.make_hello_method
Dalam kedua kasus tersebut, Anda kemudian dapat melakukan:
Bar.new.hello
yang akan mencetak "HALO". Ituclass_eval
Metode juga mengambil String, jadi itu mungkin untuk menciptakan metode on the fly, sebagai kelas sedang dibuat, yang berbeda semantik berdasarkan parameter yang berlalu dalam.
Sebenarnya, dimungkinkan untuk melakukan metaprogramming semacam ini dengan Python (dan bahasa lain, juga), tetapi Ruby memiliki keunggulan karena metaprogramming bukanlah gaya pemrograman khusus. Ini mengalir dari fakta bahwa di Ruby, semuanya adalah objek dan semua baris kode dieksekusi secara langsung. Akibatnya, Class
es itu sendiri adalah objek, badan kelas self
menunjuk ke Kelas, dan Anda dapat memanggil metode pada kelas saat Anda membuatnya.
Ini sebagian besar bertanggung jawab atas tingkat deklaratifitas yang mungkin dilakukan di Rails, dan kemudahan dalam mengimplementasikan fitur deklaratif baru yang terlihat seperti kata kunci atau fitur bahasa blok baru.