web-dev-qa-db-fra.com

Pourquoi Ruby convient-il mieux à Rails que Python?)

Python et Ruby sont généralement considérés comme des cousins ​​proches (mais avec des bagages historiques assez différents) avec une expressivité et une puissance similaires. Mais certains ont soutenu que l'immense succès du Rails le framework a vraiment beaucoup à voir avec le langage sur lequel il est construit: Ruby lui-même. Alors pourquoi Ruby serait plus approprié pour un tel cadre que Python?

90
Victor Yan

Il y a probablement deux différences majeures:

Ruby a des fermetures élégantes et anonymes.

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

Les fermetures anonymes/lambdas facilitent l'émulation de nouvelles fonctionnalités de langage qui prendraient des blocs. En Python, des fermetures existent, mais elles doivent être nommées pour être utilisées. Ainsi, au lieu de pouvoir utiliser des fermetures pour émuler de nouvelles fonctionnalités de langage, vous êtes obligé d'être explicite sur le fait que vous utilisez une fermeture.

Ruby a une métaprogrammation plus propre et plus facile à utiliser.

Ceci est largement utilisé dans Rails, principalement en raison de sa facilité d'utilisation. Pour être précis, dans 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 pouvez alors faire:

Bar.new.hello  

qui imprimera "BONJOUR". Le class_eval La méthode prend également une chaîne, il est donc possible de créer à la volée, lors de la création d'une classe, des méthodes dont la sémantique diffère en fonction des paramètres transmis.

Il est, en fait, possible de faire ce genre de métaprogrammation en Python (et d'autres langues aussi), mais Ruby a une longueur d'avance car la métaprogrammation n'est pas n'est pas un style de programmation particulier. Il découle du fait que dans Ruby, tout est un objet et que toutes les lignes de code sont directement exécutées. Par conséquent, Classes sont elles-mêmes des objets, les corps de classe ont un self pointant vers la classe, et vous pouvez appeler des méthodes sur la classe pendant que vous en créez une.

Ceci est dans une large mesure responsable du degré de déclarativité possible dans Rails et de la facilité avec laquelle nous sommes en mesure d'implémenter de nouvelles fonctionnalités déclaratives qui ressemblent à des mots clés ou à de nouvelles fonctionnalités de langage de bloc.

170
Yehuda Katz

Ceux qui ont soutenu que

l'immense succès du framework Rails a vraiment beaucoup à voir avec le langage sur lequel il est construit

se trompent (OMI). Ce succès doit probablement plus à un marketing intelligent et soutenu qu'à toute prouesse technique. Django fait sans doute un meilleur travail dans de nombreux domaines (par exemple, l'administrateur kick-ass intégré) sans avoir besoin de fonctionnalités de Ruby. Je ne dis pas du tout Ruby du tout, juste pour Python!

58
Vinay Sajip

La communauté python croit que faire les choses de la manière la plus simple et directe possible est la forme d'élégance la plus élevée. La communauté Ruby croit que faire les choses de manière intelligente qui permettre le code cool est la plus haute forme d'élégance.

Rails est tout si vous suivez certaines conventions, des tas d'autres choses se produisent comme par magie pour vous. Cela fonctionne très bien avec la manière Ruby de regarder le monde, mais ne suit pas vraiment la manière python.

54
Matt Briggs

Ce débat est-il un nouveau débat "vim versus emacs"?

Je suis un programmeur Python/Django et jusqu'à présent je n'ai jamais trouvé de problème dans ce langage/framework qui me conduirait à passer à Ruby/Rails.

Je peux imaginer que ce serait la même chose si j'avais de l'expérience avec Ruby/Rails.

Les deux ont une philosophie similaire et font le travail d'une manière rapide et élégante. Le meilleur choix est ce que vous savez déjà.

26
luc

Personnellement, je trouve que Ruby est supérieur à python à bien des égards qui comprennent ce que j'appellerais une "expressivité cohérente". Par exemple, dans Ruby, rejoignez est une méthode sur l'objet tableau qui génère une chaîne, vous obtenez donc quelque chose comme ceci:

numlist = [1,2,3,4]
#=> [1, 2, 3, 4]
numlist.join(',')
#=> "1,2,3,4"

En python, join est une méthode sur l'objet chaîne mais qui génère une erreur si vous lui passez autre chose qu'une chaîne comme chose à joindre, donc 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 petites différences qui s'accumulent avec le temps.

De plus, je ne peux pas penser à une meilleure façon d'introduire des erreurs logiques invisibles que de rendre les espaces significatifs.

25
fields

La vraie réponse est ni l'un ni l'autre Python ou Ruby sont des candidats meilleurs/pires pour un framework web. Si vous voulez l'objectivité, vous devez écrivez du code dans les deux et voyez celui qui correspond le mieux à vos préférences personnelles, y compris la communauté.

La plupart des gens qui plaident pour l'une ou l'autre n'ont jamais utilisé sérieusement l'autre langue ou "votent" pour leurs préférences personnelles.

Je suppose que la plupart des gens choisissent le premier contact avec lequel ils entrent en contact, car cela leur apprend quelque chose de nouveau (MVC, tests, générateurs, etc.) ou fait quelque chose de mieux (plugins, modèles, etc.). J'avais l'habitude de développer avec PHP et je suis entré en contact avec RubyOnRails. Si j'avais connu MVC avant de trouver Rails je n'aurais probablement jamais quitté = PHP derrière. Mais une fois que j'ai commencé à utiliser Ruby j'ai apprécié la syntaxe, les fonctionnalités, etc.).

Si j'avais trouvé Python et l'un de ses frameworks MVC en premier, je serais plus que probable en faisant l'éloge de ce langage!

15
Kris

Python possède un ensemble complet de frameworks de type Rails. Il y en a tellement qu'une plaisanterie raconte qu'au cours de la conférence typique de PyCon, au moins un cadre Web verra le jour.

L'argument selon lequel la méta-programmation Rubys la rendrait mieux adaptée est incorrect de l'OMI. Vous n'avez pas besoin de métaprogrammation pour des frameworks comme celui-ci.

Je pense donc que nous pouvons conclure que Ruby ne sont pas meilleurs (et probablement ni pires) que Python à cet égard).

11
Lennart Regebro

Parce que Rails est développé pour tirer parti des fonctionnalités de Rubys.

Une question similaire sans gorm serait "Pourquoi est Python plus approprié pour Django que Ruby est?").

8
Paddy3118

Je suppose que nous ne devrions pas discuter des fonctionnalités linguistiques en soi mais plutôt des accents que les communautés respectives font sur les fonctionnalités linguistiques. Par exemple, en Python, la réouverture d'une classe est parfaitement possible mais elle n'est pas courante; à Ruby, cependant, la réouverture d'une classe fait partie de la pratique quotidienne. cela permet une personnalisation rapide et directe du cadre à l'exigence actuelle et rend Ruby plus favorable pour les cadres de type Rails que tout autre langage dynamique. D'où ma réponse: utilisation courante de la réouverture Des classes.

4
Giorgi

Je pense que la syntaxe est plus propre et Ruby, pour moi au moins, est juste beaucoup plus "agréable" - aussi subjectif que cela soit!

1
James Schorr

Certains ont dit que le type de métaprogrammation requis pour rendre ActiveRecord (un composant clé de Rails) possible est plus facile et plus naturel à faire dans Ruby que dans python - Je ne sais pas python encore;), donc je ne peux pas personnellement confirmer cette affirmation.

J'ai utilisé Rails brièvement, et son utilisation de catchalls/interceptors et d'évaluation dynamique/injection de code vous permet de fonctionner à un niveau d'abstraction beaucoup plus élevé que certains des autres frameworks (avant son temps) J'ai peu ou pas d'expérience avec le framework Python - mais j'ai entendu dire qu'il est tout aussi capable - et que la communauté python fait un excellent travail en soutenant et en encourageant les efforts Pythonic.

1
Faisal Vali