Python et Ruby sont généralement réputées proches cousins (bien qu’avec tout autre bagage historique) avec la puissance et l’expressivité similaire. Mais certains ont avancé que l’immense succès du framework Rails a vraiment beaucoup de choses à faire avec la langue, il est construit sur : Ruby lui-même. Alors pourquoi Ruby serait plus approprié pour un tel cadre que Python ?
Réponses
Trop de publicités?Il y a probablement deux différences majeures:
Ruby est élégant, anonyme fermetures.
Rails les utilise à bon escient. Voici un exemple:
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
Anonyme fermetures/lambdas rendre plus facile à émuler les nouvelles fonctionnalités de langage qui permettrait de prendre des blocs. En Python, les fermetures existent, mais ils doivent être nommé afin de pouvoir être utilisé. Ainsi, au lieu d'être en mesure d'utiliser les fermetures à émuler les nouvelles fonctionnalités de langage, vous êtes obligé d'être explicite sur le fait que vous êtes à l'aide d'une fermeture.
Ruby est plus propre, plus facile à utiliser la métaprogrammation.
Ceci est largement utilisé dans les Rails, principalement en raison de combien il est facile à utiliser. Pour être plus précis, en Ruby, vous pouvez exécuter du code arbitraire dans le contexte de la classe. Les extraits suivants sont équivalents:
class Foo
def self.make_hello_method
class_eval do
def hello
puts "HELLO"
end
end
end
end
class Bar < Foo # snippet 1
make_hello_method
end
class Bar < Foo; end # snippet 2
Bar.make_hello_method
Dans les deux cas, vous pourrez alors faire:
Bar.new.hello
qui affiche "BONJOUR". L' class_eval
méthode prend également une Chaîne de caractères, il est donc possible de créer des méthodes à la volée, comme une classe est créée, qui ont différentes sémantique basé sur les paramètres qui sont passés dans l'.
Il est, en effet, possible de faire ce genre de métaprogrammation en Python (et autres langues), mais Ruby a une jambe parce que la métaprogrammation n'est pas un style de programmation. Il découle du fait qu'en Ruby, tout est un objet et toutes les lignes de code sont directement exécuté. En conséquence, Class
es sont eux-mêmes des objets, de la classe des organismes ont un self
de pointage à la Classe, et vous pouvez appeler les méthodes de la classe que vous en créez un.
C'est dans une large mesure responsable pour le degré de declarativeness possible dans les Rails, et la facilité avec laquelle nous sommes en mesure de mettre en œuvre de nouvelles déclarative des caractéristiques qui ressemblent à des mots clés ou des nouveau bloc fonctionnalités de langage.
Ceux qui ont fait valoir que
l'immense succès de la les Rails cadre a vraiment beaucoup à faire avec la langue, il est construit sur
sont (OMI) erreur. Ce succès doit probablement plus intelligent et durable de marketing que de toutes les prouesses techniques. Django sans doute fait un meilleur travail dans de nombreux domaines (par exemple, le haut-kick-ass admin), sans la nécessité pour toutes les caractéristiques de Ruby. Je ne suis pas dissing Rubis à tous, juste debout pour Python!
La communauté python est d’avis que le fait de faire les choses le plus simple et tout droit vers l’avant possible est la plus haute forme d’élégance. La communauté ruby croit faire les choses de façon intelligente permettant de code cool est la plus haute forme d’élégance.
Rails est tout au sujet, si vous suivez certaines conventions, les charges d’autres choses arriver comme par magie pour vous. Qui jives vraiment bien avec le rubis moyen de regarder le monde, mais ne suit pas vraiment la façon python.
Est ce débat un nouveau débat « vim ou emacs » ?
Je suis un programmeur Python/Django et jusqu'à présent je n’ai jamais trouvé un problème dans cet langue ou un cadre qui m’amènerait à passer à Ruby/Rails.
Je peux imaginer qu’il serait le même si j’étais expérimenté avec Ruby/Rails.
Les deux ont la même philosophie et font le travail d’une manière rapide et élégante. Le meilleur choix, c’est ce que vous savez déjà.
Personnellement, je trouve ruby supérieure à python dans de nombreuses façons qui forment ce que j'appellerais "dans le respect de l'expressivité'. Par exemple, en ruby, rejoindre est une méthode de l'objet de tableau qui affiche une chaîne, de sorte que vous obtenez quelque chose comme ceci:
» numlist = [1,2,3,4] => [1, 2, 3, 4] » numlist.join(',') => "1,2,3,4"
En python, la jointure est une méthode sur l'objet de type string, mais qui renvoie une erreur si vous passer autre chose qu'une chaîne comme la chose à rejoindre, de sorte que la même construction est quelque chose comme:
» numlist = [1,2,3,4] » numlist [1, 2, 3, 4] » ",".join([str(i) for i in numlist]) '1,2,3,4'
Il y a beaucoup de ces petits types de différences qui s'ajoutent au fil du temps.
Aussi, je ne peux pas penser à une meilleure façon d'introduire l'invisible erreurs de logique que d'en faire des espaces importants.