Perché Ruby è più adatto per Rails che per Python? [chiuso]


90

Python e Ruby sono solitamente considerati cugini stretti (sebbene con un bagaglio storico abbastanza diverso) con espressività e potenza simili. Ma alcuni hanno sostenuto che l'immenso successo del framework Rails ha davvero molto a che fare con il linguaggio su cui è costruito: Ruby stesso. Allora perché Ruby dovrebbe essere più adatto per un simile framework rispetto a Python?


44
Allitterazione. _
Jimmy

75
"Python on Pails" non ha la stessa sensazione ...
effimero

105
@ Ephemient: credo che sarebbe Python on Planes.
Jimmy

37
@ Jimmy: Chi ha bisogno di aerei? import antigravity ;-) xkcd.com/353
Vinay Sajip

157
C'è un Java in Jail?
Nosredna

Risposte:


170

Probabilmente ci sono due differenze principali:

Ruby ha chiusure eleganti e anonime.

Rails li usa con buoni risultati. Ecco un esempio:

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

Le chiusure anonime / lambda semplificano l'emulazione di nuove funzionalità del linguaggio che richiedono blocchi. In Python, le chiusure esistono, ma devono essere denominate per poter essere utilizzate. Quindi, invece di essere in grado di utilizzare le chiusure per emulare nuove funzionalità del linguaggio, sei costretto a essere esplicito sul fatto che stai utilizzando una chiusura.

Ruby ha una metaprogrammazione più pulita e più facile da usare.

Questo è ampiamente utilizzato in Rails, principalmente per la sua facilità d'uso. Per essere precisi, in Ruby, puoi eseguire codice arbitrario nel contesto della classe. I seguenti snippet sono equivalenti:

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

In entrambi i casi, puoi quindi fare:

Bar.new.hello  

che stamperà "CIAO". Il class_evalmetodo accetta anche una stringa, quindi è possibile creare metodi al volo, mentre viene creata una classe, con semantica diversa in base ai parametri passati.

In effetti, è possibile fare questo tipo di metaprogrammazione in Python (e anche in altri linguaggi), ma Ruby ha un vantaggio perché la metaprogrammazione non è uno stile di programmazione speciale. Deriva dal fatto che in Ruby tutto è un oggetto e tutte le righe di codice vengono eseguite direttamente. Di conseguenza, gli Classes sono essi stessi oggetti, i corpi delle classi hanno un selfpuntamento alla classe e puoi chiamare metodi sulla classe mentre ne crei uno.

Questo è in gran parte responsabile del grado di dichiaratività possibile in Rails e della facilità con cui siamo in grado di implementare nuove funzionalità dichiarative che sembrano parole chiave o nuove funzionalità del linguaggio a blocchi.


40
In Python, tutto è un oggetto e anche tutte le righe di codice vengono eseguite direttamente. ;) Ma non hai un "sé" che punta alla classe nel corpo della classe, che non viene creato fino a dopo la definizione della classe, quindi devi inserire quel codice in seguito in Python, che è certamente meno elegante , ma funzionalmente equivalente.
Lennart Regebro

31
@lennart questo è il punto. Python ti consente di fare lo stesso tipo di cose con lambda con nome, decoratori e codice di inserimento dopo la creazione delle classi, ma la perdita di eleganza si somma rapidamente e rende qualcosa come Rails notevolmente più difficile da implementare o notevolmente meno elegante per gli utenti finali.
Yehuda Katz,

9
Non mi sembrano davvero grandi differenze.
Dietrich Epp

10
@lennart sono un po 'confuso. Ho detto che non ne avevi bisogno in Python, ma che non averli rendeva il codice più difficile da implementare o meno elegante per gli utenti finali (uno o l'altro). Le lingue stanno tornando complete: puoi scrivere Rails in C se vuoi.
Yehuda Katz

5
@lennart Ora entriamo in un territorio soggettivo, ma le due caratteristiche di cui ho parlato sono abbastanza convenienti quando si producono framework con un mix di programmazione dichiarativa e procedurale. La mancanza di lambda anonimi, in particolare, è una limitazione dell'espressività di Python. La mancanza di coerenza (la necessità di lavorare con le classi create solo DOPO che le classi sono state create) è altrettanto limitante.
Yehuda Katz

58

Coloro che l'hanno sostenuto

l'immenso successo del framework Rails ha davvero molto a che fare con il linguaggio su cui è costruito

sono (IMO) in errore. Quel successo probabilmente deve più a un marketing intelligente e duraturo che a qualsiasi abilità tecnica. Django fa probabilmente un lavoro migliore in molte aree (ad esempio l'amministratore kick-ass integrato) senza la necessità di alcuna funzionalità di Ruby. Non sto affatto insultando Ruby, sto solo difendendo Python!


10
Bene, qui stiamo entrando nel territorio soggettivo. Se ritieni che l'amministratore sia un "solo", forse è perché non hai goduto dei vantaggi di risparmio di tempo che conferisce. Ci sono aree in cui pensi che Django faccia peggio di Rails, a causa delle caratteristiche che ha Ruby e Python no? Il punto in realtà non è quale framework sia migliore - è se (come sottolineato altrove in questa domanda) ci sia qualcosa che manca in Python che lo rende meno capace di sviluppare un framework kick-ass. In base alle prove, non c'è tale mancanza.
Vinay Sajip

18
@ Ai downvoters: non mi dispiace, ma sono curioso di sapere perché hai pensato che la mia risposta fosse inutile . Non mi sono reso conto che uno ha votato negativo perché non era d'accordo con la posizione di qualcuno - generalmente ho votato negativo solo quando sentivo che una domanda o una risposta stava in qualche modo peggiorando le cose.
Vinay Sajip

5
Posso scrivere la mia sezione di amministrazione, non ho bisogno che sia nel framework. Preferisco altri modi per rendere la mia applicazione più facile da scrivere.
nitecoder

8
@railsninja: Buon per te. Preferisco non dover scrivere pagine standard per le faccende di pulizia amministrative di cui hanno bisogno la maggior parte dei sistemi. Recentemente, ho fatto un po 'di lavoro pro-bono per un sito web di beneficenza locale, e non sarebbe stato possibile realizzare quel sito se l'amministratore di Django non fosse stato parte dell'equazione. Così com'era, ho fornito un sito con un'interfaccia utente Ajaxified abbastanza personalizzata per gli utenti finali, ma gli amministratori di back-end hanno lavorato con l'amministratore ed era più che adeguata alle loro esigenze.
Vinay Sajip

6
@ Matt: La sua domanda è perché Ruby è PIÙ adatto di Python .. E la risposta, abbastanza correttamente, è che non lo è.
Lennart Regebro

54

La comunità di python crede che fare le cose nel modo più semplice e diretto possibile sia la più alta forma di eleganza. La comunità di ruby ​​crede che fare le cose in modi intelligenti che consentono un codice interessante sia la più alta forma di eleganza.

Rails si basa su se segui certe convenzioni, un sacco di altre cose magicamente accadono per te. Ciò si sposa molto bene con il modo rubino di guardare il mondo, ma non segue davvero il modo del pitone.


4
Certo, ma ci sono perdite di persone Perl (beh, forse non molte ) che pensano che le battute criptiche siano belle, e molte persone Lisp che giurano che sia l'unica vera lingua. Siamo decisamente in qualunque territorio fluttui-la-tua-barca.
Vinay Sajip

4
Rails non ha magia, è proprio lì nella sorgente. Se vuoi sapere come, alzati e scoprilo.
nitecoder

21
"Qualsiasi tecnologia sufficientemente avanzata è indistinguibile dalla magia." - Arthur C. Clarke
Vinay Sajip

1
"magia" significa che il framework fa un sacco di cose per te senza che ti venga chiesto direttamente. Ancora una volta, non sto esprimendo giudizi di valore, è uno stile di fare le cose che ha lati positivi e lati negativi. Personalmente, penso che funzioni meravigliosamente su rotaie.
Matt Briggs,

2
L'eleganza e le convenzioni non denotano magia.
BJ Clark

26

Questo dibattito è un nuovo dibattito "vim contro emacs"?

Sono un programmatore Python / Django e finora non ho mai riscontrato un problema in quel linguaggio / framework che mi avrebbe portato a passare a Ruby / Rails.

Posso immaginare che sarebbe lo stesso se avessi esperienza con Ruby / Rails.

Entrambi hanno una filosofia simile e svolgono il lavoro in modo veloce ed elegante. La scelta migliore è ciò che già sai.


25

Personalmente, trovo che ruby ​​sia superiore a python in molti modi che comprendono ciò che chiamerei "espressività coerente". Ad esempio, in ruby, join è un metodo sull'oggetto array che restituisce una stringa, quindi ottieni qualcosa del genere:

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

In python, join è un metodo sull'oggetto stringa ma che genera un errore se gli si passa qualcosa di diverso da una stringa come oggetto da unire, quindi lo stesso costrutto è qualcosa del tipo:

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

Ci sono molte di queste piccole differenze che si sommano nel tempo.

Inoltre, non riesco a pensare a un modo migliore per introdurre errori logici invisibili piuttosto che rendere significativi gli spazi bianchi.


29
La mia esperienza è che rendere significativi gli spazi bianchi aiuta a eliminare gli errori logici. È molto più complicato avere spaziatura e sintassi in disaccordo.
Nosredna

5
Nelle lingue con inizio e fine e nelle lingue con parentesi graffe e in assembly, ho visto il codice incollato in modo sbagliato e causare problemi in seguito. È sempre un problema. Hai avuto molti problemi con le persone che incollano male Python?
Nosredna

5
Lo spazio bianco non è significativo in Python: secnetix.de/~olli/Python/block_indentation.hawk . È quasi impossibile introdurre "errori invisibili" a causa del rientro in Python (devi modificare le impostazioni dell'editor) mentre ovviamente è completamente possibile introdurre errori invisibili dovuti al rientro in qualsiasi altra lingua, semplicemente indentando in modo errato. @fields: Quindi non copiare il codice tramite skype o HTML, quindi. Geez.
Lennart Regebro

7
È corretto che Python si lamenti se provi ad aggiungere stringhe non stringhe, come in un join. Questo perché l'esplicito è meglio dell'implicito. Ci sono pochissime conversioni automatiche in Python, e il motivo è che tendono a portare a problemi, specialmente nei linguaggi dinamici, poiché le cose finiscono per non essere il tipo che ti aspettavi che fosse. Sicuramente il metodo "" .join () sembra al contrario all'inizio, ma questo è il motivo. In realtà non ha senso sulla lista ...
Lennart Regebro

8
Dio onnipotente ... Vuoi dire tipizzato staticamente, non fortemente tipizzato. Python è fortemente tipizzato, così come Ruby: stackoverflow.com/questions/520228/… Non puoi nemmeno aggiungere una stringa a un numero intero in Ruby. Mi sto stancando di correggerti, per favore controlla i tuoi fatti prima di rispondere in futuro.
Lennart Regebro

15

La vera risposta è che Python né Ruby sono candidati migliori / peggiori per un framework web. Se vuoi l'obiettività devi scrivere del codice in entrambi e vedere quale si adatta meglio alle tue preferenze personali, comunità inclusa.

La maggior parte delle persone che discutono per l'una o l'altra non hanno mai usato seriamente l'altra lingua o stanno "votando" per le loro preferenze personali.

Immagino che la maggior parte delle persone decida di stabilire con quale prima entrare in contatto perché insegna loro qualcosa di nuovo (MVC, test, generatori, ecc.) O fa qualcosa di meglio (plugin, modelli, ecc.). Sviluppavo con PHP e sono entrato in contatto con RubyOnRails. Se avessi saputo di MVC prima di trovare Rails, molto probabilmente non avrei mai lasciato PHP alle spalle. Ma una volta che ho iniziato a usare Ruby mi sono piaciute la sintassi, le funzionalità ecc.

Se avessi trovato prima Python e uno dei suoi framework MVC, molto probabilmente avrei elogiato quel linguaggio!


11

Python ha tutta una serie di framework simili a Rails. Ce ne sono così tanti che si scherza sul fatto che durante il tipico discorso al PyCon almeno un framework web vedrà la luce.

L'argomento secondo cui la meta programmazione di Rubys lo renderebbe più adatto è IMO errato. Non è necessaria la metaprogrammazione per framework come questo.

Quindi penso che possiamo concludere che Ruby non è migliore (e probabilmente nemmeno peggiore) di Python sotto questo aspetto.


8

Perché Rails è sviluppato per sfruttare il set di funzionalità di Rubys.

Una domanda altrettanto priva di gorm sarebbe "Perché Python è più adatto per Django di Ruby?".


4

Suppongo che non dovremmo discutere le caratteristiche della lingua in sé, ma piuttosto gli accenti che le rispettive comunità fanno sulle caratteristiche della lingua. Ad esempio, in Python, riaprire una classe è perfettamente possibile ma non è comune; in Ruby, tuttavia, la riapertura di una classe è una pratica quotidiana. questo consente una rapida e diretta personalizzazione del framework in base ai requisiti attuali e rende Ruby più favorevole per framework simili a Rails rispetto a qualsiasi altro linguaggio dinamico. Da qui la mia risposta: uso comune delle classi di riapertura.


1

Alcuni hanno detto che il tipo di metaprogrammazione richiesto per rendere possibile ActiveRecord (un componente chiave di rails) è più facile e più naturale da fare in ruby ​​che in python - non conosco ancora python;), quindi non posso confermare personalmente questa affermazione.

Ho usato rails brevemente e il suo uso di catchall / interceptor e di valutazione dinamica / iniezione di codice ti consente di operare a un livello di astrazione molto più elevato rispetto ad altri framework (prima del tempo). Ho poca o nessuna esperienza con il framework di Python - ma ho sentito che è altrettanto capace - e che la comunità di Python fa un ottimo lavoro supportando e promuovendo gli sforzi pitonici.


3
In effetti, questo tipo di "magia" è spesso disapprovato in Python; ad esempio, code.djangoproject.com/wiki/RemovingTheMagic
ephemient

2
Penso che la "magia" (trucchi di metaprogrammazione) per amore della "magia" dovrebbe sempre essere disapprovata - il codice più semplice, ma ugualmente potente ed espressivo, dovrebbe sempre vincere - ma ci sono casi in cui l'unico modo per fornire l' esatta funzionalità e sintassi si vuole richiede "magia" - e in quei casi, la "magia" è indispensabile;)
Faisal Vali

1

Penso che la sintassi sia più pulita e Ruby, almeno per me, è solo molto più "divertente" - per quanto soggettivo sia!


-1

Due risposte:

un. Perché rails è stato scritto per ruby.

b. Per lo stesso motivo C più adatto a Linux di Ruby


Dato il contesto della domanda la risposta non ha assolutamente senso.
lorefnon

-6

Tutto questo è TOTALMENTE "IMHO"

In Ruby c'è UN UNICO framework per applicazioni web, quindi è l'unico framework pubblicizzato per quel linguaggio.

Python ha avuto diversi sin dall'inizio, solo per citarne alcuni: Zope, Twisted, Django, TurboGears (esso stesso un mix di altri componenti del framework), Pylons (una specie di clone del framework Rails) e così via. Nessuno di loro è supportato da tutta la comunità Python come "THE one to use", quindi tutte le "onde" sono distribuite su diversi progetti.

Rails ha la dimensione della comunità esclusivamente, o almeno nella stragrande maggioranza, a causa di Rails.

Sia Python che Ruby sono perfettamente in grado di svolgere il lavoro come framework per applicazioni web. Usa quello che piace a TE (e al tuo potenziale team di sviluppo) e su cui puoi allinearti.


7
ruby ha più framework di applicazioni web: Nitro, Merb, Camping .. per citarne alcuni
Corban Brook

5
Aggiungi: Sinatra e persino un'app Rack per applicazioni web molto veloci e minimali.
Kris

2
-1 "In Ruby c'è UN UNICO framework per applicazioni web" troppo categorico ... per una dichiarazione falsa. Nitro, Merb, Camping, Sinatra
Maximiliano Guzman

2
Le opinioni disinformate da entrambe le parti sono esattamente la causa di confusione per i nuovi arrivati ​​che stanno cercando di risolvere tutto questo. Significa anche che ci si potrebbe perdere qualcosa che apprezzerebbero davvero se lo sapessero meglio.
Walt Jones,

3
Penso che il suo punto fosse che Rails ha una grande
condivisione mentale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.