อาจมีความแตกต่างที่สำคัญสองประการ:
Ruby มีการปิดที่สวยงามและไม่ระบุชื่อ
Rails ใช้ให้เกิดผลดี นี่คือตัวอย่าง:
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
การปิด / lambdas แบบไม่ระบุตัวตนทำให้ง่ายต่อการเลียนแบบคุณลักษณะภาษาใหม่ที่จะบล็อก ใน Python มีการปิดอยู่ แต่ต้องตั้งชื่อจึงจะใช้งานได้ ดังนั้นแทนที่จะใช้การปิดเพื่อเลียนแบบคุณลักษณะภาษาใหม่ ๆ ได้คุณจะต้องเปิดเผยอย่างชัดเจนเกี่ยวกับข้อเท็จจริงที่ว่าคุณกำลังใช้การปิด
Ruby มี metaprogramming ที่สะอาดและใช้งานง่ายกว่า
สิ่งนี้ถูกใช้อย่างกว้างขวางใน Rails ส่วนใหญ่เป็นเพราะความง่ายในการใช้งาน เพื่อให้เฉพาะเจาะจงใน Ruby คุณสามารถรันโค้ดโดยอำเภอใจในบริบทของคลาสได้ ตัวอย่างต่อไปนี้เทียบเท่า:
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
ในทั้งสองกรณีคุณสามารถทำได้:
Bar.new.hello
ซึ่งจะพิมพ์คำว่า "HELLO" class_eval
วิธีการยังใช้สตริงดังนั้นจึงเป็นไปได้ที่จะสร้างวิธีการในการบินเป็นชั้นจะถูกสร้างขึ้นที่มีความหมายที่แตกต่างกันขึ้นอยู่กับพารามิเตอร์ที่จะถูกส่งผ่านใน
ในความเป็นจริงเป็นไปได้ที่จะทำ metaprogramming ประเภทนี้ใน Python (และภาษาอื่น ๆ ด้วย) แต่ Ruby มีข้อได้เปรียบเนื่องจาก metaprogramming ไม่ใช่รูปแบบพิเศษของการเขียนโปรแกรม มันมาจากข้อเท็จจริงที่ว่าใน Ruby ทุกอย่างเป็นวัตถุและโค้ดทุกบรรทัดจะถูกเรียกใช้โดยตรง ด้วยเหตุนี้Class
es ก็คือวัตถุในตัวมันเองส่วนของคลาสมีการself
ชี้ไปที่คลาสและคุณสามารถเรียกใช้เมธอดในคลาสได้ในขณะที่คุณกำลังสร้าง
นี่เป็นความรับผิดชอบระดับใหญ่สำหรับระดับของการประกาศที่เป็นไปได้ใน Rails และความสะดวกที่เราสามารถใช้คุณสมบัติการประกาศใหม่ที่มีลักษณะเหมือนคำหลักหรือคุณลักษณะภาษาบล็อกใหม่