Вероятно, есть два основных отличия:
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
Анонимные замыкания / лямбда-выражения упрощают эмуляцию новых языковых функций, которые принимают блоки. В Python замыкания существуют, но они должны быть названы, чтобы их можно было использовать. Таким образом, вместо того, чтобы использовать замыкания для имитации новых языковых функций, вы вынуждены четко указать, что вы используете замыкание.
Ruby имеет более чистое и простое в использовании метапрограммирование.
Это широко используется в 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
Метод также принимает строку, так что можно создавать методы на лету, как создается класс, что имеют различную семантику на основе параметров, которые передаются в.
На самом деле, такое метапрограммирование возможно в Python (и других языках тоже), но у Ruby есть преимущество, потому что метапрограммирование - это не особый стиль программирования. Это вытекает из того факта, что в Ruby все является объектом, и все строки кода выполняются напрямую. В результате Class
es сами являются объектами, тела классов self
указывают на класс, и вы можете вызывать методы класса по мере его создания.
Это в значительной степени отвечает за степень декларативности, возможную в Rails, и легкость, с которой мы можем реализовать новые декларативные функции, которые выглядят как ключевые слова или новые возможности блочного языка.