Ruby ha i blocchi; Python no.
Python ha funzioni; Ruby no. In Python, puoi prendere qualsiasi funzione o metodo e passarlo a un'altra funzione. In Ruby, tutto è un metodo e i metodi non possono essere passati direttamente. Invece, devi avvolgerli in Proc per passarli.
Ruby e Python supportano entrambe le chiusure, ma in diversi modi. In Python, puoi definire una funzione all'interno di un'altra funzione. La funzione interna ha accesso in lettura alle variabili dalla funzione esterna, ma non accesso in scrittura. In Ruby, definisci le chiusure usando i blocchi. Le chiusure hanno pieno accesso in lettura e scrittura alle variabili dall'ambito esterno.
Python ha una comprensione delle liste, che sono piuttosto espressive. Ad esempio, se si dispone di un elenco di numeri, è possibile scrivere
[x*x for x in values if x > 15]
per ottenere un nuovo elenco dei quadrati di tutti i valori maggiori di 15. In Ruby, dovresti scrivere quanto segue:
values.select {|v| v > 15}.map {|v| v * v}
Il codice Ruby non sembra compatto. Inoltre, non è altrettanto efficiente poiché converte prima l'array di valori in un array intermedio più corto contenente i valori maggiori di 15. Quindi, prende l'array intermedio e genera un array finale contenente i quadrati degli intermedi. L'array intermedio viene quindi eliminato. Quindi, Ruby finisce con 3 array in memoria durante il calcolo; Python necessita solo dell'elenco di input e dell'elenco risultante.
Python fornisce anche una comprensione simile della mappa.
Python supporta le tuple; Ruby no. In Ruby, devi usare le matrici per simulare le tuple.
Ruby supporta le istruzioni switch / case; Python no.
Ruby supporta l' expr ? val1 : val2
operatore ternario standard ; Python no.
Ruby supporta solo una singola eredità. Se è necessario imitare l'ereditarietà multipla, è possibile definire i moduli e utilizzare i mix-in per inserire i metodi del modulo in classi. Python supporta l'ereditarietà multipla anziché i mix-in dei moduli.
Python supporta solo funzioni lambda a linea singola. I blocchi ruby, che sono una sorta di / sorta di funzioni lambda, possono essere arbitrariamente grandi. Per questo motivo, il codice Ruby è in genere scritto in uno stile più funzionale rispetto al codice Python. Ad esempio, per scorrere su un elenco in Ruby, in genere lo fai
collection.each do |value|
...
end
Il blocco funziona in modo molto simile a una funzione passata a collection.each
. Se dovessi fare la stessa cosa in Python, dovresti definire una funzione interna denominata e poi passarla alla raccolta ogni metodo (se l'elenco supporta questo metodo):
def some_operation(value):
...
collection.each(some_operation)
Non scorre molto bene. Quindi, in genere in Python verrebbe utilizzato il seguente approccio non funzionale:
for value in collection:
...
L'uso delle risorse in modo sicuro è abbastanza diverso tra le due lingue. Qui, il problema è che si desidera allocare alcune risorse (aprire un file, ottenere un cursore di database, ecc.), Eseguire alcune operazioni arbitrarie su di esso e quindi chiuderlo in modo sicuro anche se si verifica un'eccezione.
In Ruby, poiché i blocchi sono così facili da usare (vedi # 9), in genere codifichi questo modello come un metodo che accetta un blocco per eseguire l'operazione arbitraria sulla risorsa.
In Python, passare una funzione per l'azione arbitraria è un po 'più clunkier poiché devi scrivere una funzione interna denominata (vedi # 9). Invece, Python utilizza with
un'istruzione per la gestione sicura delle risorse. Vedi Come posso pulire correttamente un oggetto Python? per ulteriori dettagli.