Hay muchas discusiones sobre Python vs Ruby, y todas las encuentro completamente inútiles, porque todas dan vueltas por qué la característica X es una mierda en el lenguaje Y, o eso afirma que el lenguaje Y no tiene X, aunque en realidad sí lo tiene. También sé exactamente por qué prefiero Python, pero eso también es subjetivo, y no ayudaría a nadie a elegir, ya que es posible que no tengan los mismos gustos en desarrollo que yo.
Por lo tanto, sería interesante enumerar las diferencias de manera objetiva. Así que no "las lambdas de Python apestan". En cambio, explique lo que las lambdas de Ruby pueden hacer que Python no puede hacer. Sin subjetividad. ¡El código de ejemplo es bueno!
No tenga varias diferencias en una respuesta, por favor. Y vote por los que sabe que son correctos, y por los que sabe que son incorrectos (o subjetivos). Además, las diferencias en la sintaxis no son interesantes. Sabemos que Python hace con sangría lo que Ruby hace con corchetes y extremos, y que @ se llama self en Python.
ACTUALIZACIÓN: Esta es ahora una wiki comunitaria, por lo que podemos agregar las grandes diferencias aquí.
Ruby tiene una referencia de clase en el cuerpo de la clase.
En Ruby tienes una referencia a la clase (self) que ya está en el cuerpo de la clase. En Python, no tiene una referencia a la clase hasta que finaliza la construcción de la clase.
Un ejemplo:
class Kaka
puts self
end
self en este caso es la clase, y este código imprimirá "Kaka". No hay forma de imprimir el nombre de la clase o de otra manera acceder a la clase desde el cuerpo de definición de clase en Python (definiciones de método externas).
Todas las clases son mutables en Ruby.
Esto le permite desarrollar extensiones para las clases principales. Aquí hay un ejemplo de una extensión de rieles:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
Python (imagina que no hubiera ''.startswith
método):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
Puede usarlo en cualquier secuencia (no solo cadenas). Con el fin de utilizarlo debe importar que explícitamente por ejemplo, from some_module import starts_with
.
Ruby tiene características de script similares a Perl
Ruby tiene expresiones regulares de primera clase, $ -variables, el bucle de entrada línea por línea awk / perl y otras características que lo hacen más adecuado para escribir pequeños scripts de shell que combinan archivos de texto o actúan como código de pegamento para otros programas.
Ruby tiene continuaciones de primera clase.
Gracias a la declaración callcc. En Python puede crear continuaciones mediante diversas técnicas, pero no hay soporte integrado en el lenguaje.
Ruby tiene bloques
Con la instrucción "do" puede crear una función anónima de varias líneas en Ruby, que se pasará como un argumento al método frente a do, y se llamará desde allí. En Python, en su lugar, haría esto ya sea pasando un método o con generadores.
Rubí:
amethod { |here|
many=lines+of+code
goes(here)
}
Python (los bloques Ruby corresponden a diferentes construcciones en Python):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
O
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
O
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
Curiosamente, la declaración de conveniencia en Ruby para llamar a un bloque se llama "rendimiento", que en Python creará un generador.
Rubí:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
Pitón:
def themethod():
yield 5
for foo in themethod():
print foo
Aunque los principios son diferentes, el resultado es sorprendentemente similar.
Ruby admite la programación de estilo funcional (similar a una tubería) más fácilmente
myList.map(&:description).reject(&:empty?).join("\n")
Pitón:
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
Python tiene generadores integrados (que se usan como bloques Ruby, como se señaló anteriormente)
Python tiene soporte para generadores en el lenguaje. En Ruby 1.8 puede usar el módulo generador que usa las continuaciones para crear un generador a partir de un bloque. O bien, ¡podría usar un bloque / proc / lambda! Además, en Ruby 1.9 las fibras son, y se pueden usar como, generadores, y la clase Enumerator es un generador incorporado 4
docs.python.org tiene este ejemplo de generador:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
Contraste esto con los ejemplos de bloques anteriores.
Python tiene un manejo flexible del espacio de nombres
En Ruby, cuando importa un archivo con require
, todas las cosas definidas en ese archivo terminarán en su espacio de nombres global. Esto causa la contaminación del espacio de nombres. La solución a eso son los módulos Rubys. Pero si crea un espacio de nombres con un módulo, entonces debe usar ese espacio de nombres para acceder a las clases contenidas.
En Python, el archivo es un módulo y puede importar sus nombres contenidos from themodule import *
, contaminando así el espacio de nombres si lo desea. Pero también puede importar nombres seleccionados con from themodule import aname, another
o simplemente puede import themodule
y luego acceder a los nombres con themodule.aname
. Si desea más niveles en su espacio de nombres, puede tener paquetes, que son directorios con módulos y un __init__.py
archivo.
Python tiene docstrings
Las cadenas de documentos son cadenas que se adjuntan a módulos, funciones y métodos y pueden introspectarse en tiempo de ejecución. Esto ayuda a crear cosas como el comando de ayuda y la documentación automática.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
Los equivalentes de Ruby son similares a los javadocs, y se encuentran sobre el método en lugar de dentro de él. Se pueden recuperar en tiempo de ejecución de los archivos mediante el uso del ejemplo del método # source_location 1.9 de 1.9
Python tiene herencia múltiple
Ruby no lo hace ("a propósito" - vea el sitio web de Ruby, vea aquí cómo se hace en Ruby ). Reutiliza el concepto de módulo como un tipo de clases abstractas.
Python tiene comprensiones de listas / dict
Pitón:
res = [x*x for x in range(1, 10)]
Rubí:
res = (0..9).map { |x| x * x }
Pitón:
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Rubí:
p = proc { |x| x * x }
(0..9).map(&p)
Python 2.7+ :
>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}
Rubí:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
Python tiene decoradores
También se pueden crear cosas similares a los decoradores en Ruby, y también se puede argumentar que no son tan necesarios como en Python.
Diferencias de sintaxis
Ruby requiere "fin" o "}" para cerrar todos sus ámbitos, mientras que Python usa solo espacios en blanco. Ha habido intentos recientes en Ruby para permitir espacios en blanco solo sangría http://github.com/michaeledgar/seamless
Respuestas:
Ruby tiene los conceptos de bloques , que son esencialmente azúcar sintáctico alrededor de una sección de código; son una forma de crear cierres y pasarlos a otro método que puede o no usar el bloque. Se puede invocar un bloque más adelante mediante una
yield
declaración.Por ejemplo, una definición simple de un
each
método enArray
podría ser algo como:Entonces puedes invocar esto así:
Python tiene funciones / cierres / lambdas anónimos, pero no tiene bloques, ya que le falta algo del azúcar sintáctico útil. Sin embargo, hay al menos una forma de obtenerlo de manera ad-hoc. Ver, por ejemplo, aquí .
fuente
Ejemplo de Python
Las funciones son variables de primera clase en Python. Puede declarar una función, pasarla como un objeto y sobrescribirla:
Esta es una característica fundamental de los lenguajes de script modernos. JavaScript y Lua también hacen esto. Ruby no trata las funciones de esta manera; nombrar una función la llama.
Por supuesto, hay formas de hacer estas cosas en Ruby, pero no son operaciones de primera clase. Por ejemplo, puede ajustar una función con Proc.new para tratarla como una variable, pero ya no es una función; Es un objeto con un método de "llamada".
Las funciones de Ruby no son objetos de primera clase.
Las funciones de Ruby no son objetos de primera clase. Las funciones deben estar envueltas en un objeto para pasarlas; El objeto resultante no puede ser tratado como una función. Las funciones no se pueden asignar de manera de primera clase; en su lugar, se debe llamar a una función en su objeto contenedor para modificarlos.
fuente
x = y
no por llamadaself.class.send(:define_method, :func, method(:func2))
. Su "contraejemplo" muestra cómo las funciones de Ruby no son de primera clase. Si no está de acuerdo, no dude en publicar su propia respuesta; no pegues tu confusión en la mía.def ... end
en ruby no son funciones. Son métodos (la forma en que los has definidoKernel
). Los métodos pueden ser independientes (utilizando el#method
método), que luego son objetos. Lo más cercano que tiene Ruby a las funciones son lasProc
instancias, que también son objetos, y se pueden pasar o invocar. También tiene una sintaxis especial para pasar una única devoluciónProc
de llamada a un método, como John Feminella comenta en su respuesta .UnboundMethod
puede ser un PITA, aunque.En última instancia, todas las respuestas serán subjetivas en algún nivel, y las respuestas publicadas hasta ahora prueban que no se puede señalar ninguna característica que no sea factible en el otro idioma de una manera igualmente agradable (si no similar) , ya que ambos idiomas son muy concisos y expresivos.
Me gusta la sintaxis de Python. Sin embargo, debes profundizar un poco más que la sintaxis para encontrar la verdadera belleza de Ruby. Hay belleza zenlike en la consistencia de Ruby. Si bien ningún ejemplo trivial puede explicar esto completamente, intentaré encontrar uno aquí solo para explicar lo que quiero decir.
Invierta las palabras en esta cadena:
Cuando piense en cómo lo haría, haría lo siguiente:
En Ruby, harías esto:
Exactamente como lo piensa, en la misma secuencia, una llamada de método tras otra.
En python, se vería más así:
No es difícil de entender, pero no tiene el mismo flujo. El sujeto (oración) está enterrado en el medio. Las operaciones son una mezcla de funciones y métodos de objeto. Este es un ejemplo trivial, pero uno descubre muchos ejemplos diferentes cuando realmente trabaja y comprende Ruby, especialmente en tareas no triviales.
fuente
Python tiene una mentalidad de "todos somos adultos aquí". Por lo tanto, encontrará que Ruby tiene cosas como constantes, mientras que Python no (aunque las constantes de Ruby solo generan una advertencia). La forma de pensar de Python es que si quieres hacer algo constante, debes poner los nombres de las variables en mayúsculas y no cambiarlo.
Por ejemplo, Ruby:
Pitón:
fuente
Solo puede importar funciones específicas de un módulo en Python. En Ruby, importa la lista completa de métodos. Podrías "no importarlos" en Ruby, pero no se trata de eso.
EDITAR:
tomemos este módulo Ruby:
si lo incluye en su código:
verá que tanto el método1 como el método2 se han agregado a su espacio de nombres. No puede importar solo el método1 . Los importas a ambos o no los importas en absoluto. En Python puede importar solo los métodos que elija. Si esto tuviera un nombre, ¿tal vez se llamaría importación selectiva?
fuente
import bla; bla.foo()
en Ruby?module
realidad es un nombre poco apropiado. Los módulos son básicamente clases sans elnew
,allocate
métodos. Funcionan mejor como una forma de compartir código por clase / objeto, no como mecanismo para particionar bibliotecas, o para compartir código entre programas.Desde el sitio web de Ruby :
Similitudes Como con Python, en Ruby, ...
Diferencias a diferencia de Python, en Ruby, ...
fuente
Lo que Ruby tiene sobre Python son sus capacidades de lenguaje de script. El lenguaje de secuencias de comandos en este contexto significa que se utilizará para el "código de pegamento" en los scripts de shell y la manipulación general de texto.
Estos se comparten principalmente con Perl. Expresiones regulares incorporadas de primera clase, $ -Variables, opciones útiles de línea de comandos como Perl (-a, -e) etc.
Junto con su sintaxis breve pero epxresiva, es perfecta para este tipo de tareas.
Python para mí es más un lenguaje de negocios de tipo dinámico que es muy fácil de aprender y tiene una sintaxis clara. No es tan "genial" como Ruby, pero ordenado. Lo que Python tiene sobre Ruby para mí es la gran cantidad de enlaces para otras bibliotecas. Enlaces a Qt y otras bibliotecas GUI, muchas bibliotecas de soporte de juegos y y y. Ruby tiene mucho menos. Si bien los enlaces muy utilizados, por ejemplo, a las bases de datos son de buena calidad, encontré que las bibliotecas de nicho son mejor compatibles con Python, incluso si para la misma biblioteca también hay un enlace Ruby.
Entonces, yo diría que ambos idiomas tienen su uso y es la tarea que define cuál usar. Ambos son lo suficientemente fáciles de aprender. Los uso uno al lado del otro. Ruby para scripting y Python para aplicaciones independientes.
fuente
No creo que "Ruby tenga X y Python no, mientras que Python tiene Y y Ruby no" es la forma más útil de verlo. Son lenguajes bastante similares, con muchas habilidades compartidas.
En gran medida, la diferencia es lo que el lenguaje hace elegante y legible. Para usar un ejemplo que mencionaste, ambos teóricamente tienen lambdas, pero los programadores de Python tienden a evitarlos, y las construcciones hechas con ellos no parecen tan legibles o idiomáticas como en Ruby. Entonces, en Python, un buen programador querrá tomar una ruta diferente para resolver el problema que lo haría en Ruby, solo porque en realidad es la mejor manera de hacerlo.
fuente
for format in respond_to()
. Elrespond_to
método no devuelve nada significativo, simplemente responde a la solicitud HTTP actual. Eldo
enrespond_to do
es el comienzo de un bloque. En ese bloque, hablamos con un objeto temporal (etiquetadoformat
en este ejemplo) que implementa un DSL muy básico para responder a una solicitud HTTP.Me gustaría sugerir una variante de la pregunta original, "¿Qué tiene Ruby que Python no tiene y viceversa?" que admite la respuesta decepcionante: "Bueno, ¿qué puedes hacer con Ruby o Python que no se puede hacer en Intercal?" Nada en ese nivel, porque Python y Ruby son ambos parte de la vasta familia real sentada en el trono de ser aproximadamente Turing.
Pero qué hay de esto:
¿Qué se puede hacer con gracia y bien en Python que no se puede hacer en Ruby con tanta belleza y buena ingeniería, o viceversa?
Eso puede ser mucho más interesante que la mera comparación de características.
fuente
Python tiene una sintaxis incorporada explícita para comprensiones de listas y generadores, mientras que en Ruby usaría bloques de código y de mapa.
Comparar
a
fuente
res=map(2 .__rpow__, range(1,10))
"Las variables que comienzan con mayúscula se convierten en constantes y no se pueden modificar"
Incorrecto. Ellos pueden.
Solo recibes una advertencia si lo haces.
fuente
Algo más en el lado de la infraestructura:
Python tiene una integración mucho mejor con C ++ (a través de cosas como Boost.Python , SIP y Py ++ ) que Ruby, donde las opciones parecen estar escritas directamente en la API de intérprete de Ruby (que también puede hacer con Python, por supuesto, pero en ambos casos, hacerlo es de bajo nivel, tedioso y propenso a errores) o usar SWIG (que, si bien funciona y definitivamente es excelente si desea admitir muchos idiomas, no es tan bueno como Boost.Python o SIP si específicamente está buscando vincular C ++).
Python tiene varios entornos de aplicaciones web (Django, Pylons / Turbogears, web.py, probablemente al menos media docena de otros), mientras que Ruby (efectivamente) tiene uno: Rails. (Existen otros marcos web de Ruby, pero aparentemente tienen dificultades para obtener mucha tracción contra Rails). ¿Es este aspecto bueno o malo? Difícil de decir, y probablemente bastante subjetivo; Puedo imaginar fácilmente argumentos de que la situación de Python es mejor y que la situación de Ruby es mejor.
Culturalmente, las comunidades Python y Ruby parecen algo diferentes, pero solo puedo insinuar esto, ya que no tengo mucha experiencia interactuando con la comunidad Ruby. Estoy agregando esto principalmente con la esperanza de que alguien que tenga mucha experiencia con ambos pueda amplificar (o rechazar) esta declaración.
fuente
Copió / pegó descaradamente de: Alex Martelli responde en el hilo " ¿Qué es mejor sobre Ruby que Python " de la lista de correo comp.lang.python .
fuente
Algunos otros de:
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
(Si he malinterpretado algo o alguno de estos ha cambiado en el lado de Ruby desde que se actualizó esa página, alguien puede editarlo ...)
Las cadenas son mutables en Ruby, no en Python (donde las nuevas cadenas son creadas por "cambios").
Ruby tiene algunas convenciones de casos forzados, Python no.
Python tiene listas y tuplas (listas inmutables). Ruby tiene matrices correspondientes a las listas de Python, pero no hay una variante inmutable de ellas.
En Python, puede acceder directamente a los atributos del objeto. En Ruby, siempre es a través de métodos.
En Ruby, los paréntesis para las llamadas a métodos suelen ser opcionales, pero no en Python.
Ruby tiene acceso público, privado y protegido para forzar el acceso, en lugar de la convención de Python de utilizar guiones bajos y nombres de nombres.
Python tiene herencia múltiple. Ruby tiene "mixins".
Y otro enlace muy relevante:
http://c2.com/cgi/wiki?PythonVsRuby
Lo que, en particular, enlaza con otro bueno de Alex Martelli , quien también ha estado publicando muchas cosas geniales aquí en SO:
http://groups.google.com/group/comp.lang.python/msg/028422d707512283
fuente
No estoy seguro de esto, así que primero lo agrego como respuesta.
Python trata los métodos independientes como funciones
Eso significa que puede llamar a un método como
theobject.themethod()
o porTheClass.themethod(anobject)
.Editar: aunque la diferencia entre métodos y funciones es pequeña en Python y no existe en Python 3, tampoco existe en Ruby, simplemente porque Ruby no tiene funciones. Cuando define funciones, en realidad está definiendo métodos en Object.
Pero aún no puede tomar el método de una clase y llamarlo como una función, tendría que volver a vincularlo al objeto al que desea llamar, lo que es mucho más obstinado.
fuente
TheClass.instance_method(:themethod).bind(anobject).call
sería el rubí equivalente.Object
.Me gustaría mencionar la API de descriptor de Python que permite personalizar la "comunicación" de objeto a atributo. También es digno de mención que, en Python, uno es libre de implementar un protocolo alternativo anulando el valor predeterminado dado a través de la implementación predeterminada del
__getattribute__
método. Permítanme dar más detalles sobre lo mencionado anteriormente. Los descriptores son clases regulares con__get__
,__set__
y / o__delete__
métodos. Cuando el intérprete encuentra algo como estoanObj.anAttr
, se realiza lo siguiente:__getattribute__
anObj
Se invoca el método de__getattribute__
recupera un objeto Attr de la clase dict__get__
,__set__
o__delete__
los objetos no desembolsadasComo se mencionó, este es el comportamiento predeterminado. Uno es libre de cambiar el protocolo al volver a implementarlo
__getattribute__
.Esta técnica es mucho más poderosa que los decoradores.
fuente
Ruby tiene soporte de continuación incorporado usando
callcc
.Por lo tanto, puede implementar cosas interesantes como el operador amb
fuente
En esta etapa, Python todavía tiene un mejor soporte Unicode
fuente
Python tiene cadenas de documentos y Ruby no ... O si no las tiene, no son accesibles tan fácilmente como en Python.
PD. Si estoy equivocado, bonito por favor, ¿deja un ejemplo? Tengo una solución alternativa que podría incluir en las clases con bastante facilidad, pero me gustaría tener la función docstring de alguna manera "nativa".
fuente
Ruby tiene un bucle línea por línea sobre los archivos de entrada (el indicador '-n') desde la línea de comandos para que pueda usarse como AWK. Esta línea de rubí:
contará líneas como el AWK one-liner:
Ruby obtiene esta función a través de Perl, que lo tomó de AWK como una forma de hacer que los administradores de sistemas se unan a Perl sin tener que cambiar la forma en que hacen las cosas.
fuente
python -c "import sys; print len(list(sys.stdin))"
Ruby tiene sigilos y ramitas, Python no.
Editar : Y una cosa muy importante que olvidé (después de todo, lo anterior fue solo para encender un poco :-p):
Python tiene un compilador JIT ( Psyco ), un lenguaje de nivel visualmente inferior para escribir código más rápido ( Pyrex ) y la capacidad de agregar código C ++ en línea ( Weave ).
fuente
Mi pitón está oxidado, por lo que algunos de estos pueden estar en python y simplemente no recuerdo / nunca aprendí en primer lugar, pero aquí están los primeros que pensé:
Espacio en blanco
Ruby maneja los espacios en blanco completamente diferentes. Para empezar, no necesita sangrar nada (lo que significa que no importa si usa 4 espacios o 1 pestaña). También realiza la continuación de línea inteligente, por lo que lo siguiente es válido:
Básicamente, si termina con un operador, se da cuenta de lo que está sucediendo.
Mixins
Ruby tiene mixins que pueden extender instancias en lugar de clases completas:
Enumeraciones
No estoy seguro de si esto es lo mismo que los generadores, pero a partir de Ruby 1.9 ruby como enumeraciones, entonces
Referencia: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed
"Argumentos de palabras clave"
Los dos elementos enumerados allí son compatibles con Ruby, aunque no puede omitir valores predeterminados como ese. Puedes ir en orden
Tenga en cuenta que c = 5 en realidad asigna a la variable c en el alcance de la llamada el valor 5 y establece el parámetro b en el valor 5.
o puede hacerlo con hashes, que abordan el segundo problema
Referencia: La guía del programador pragmático para Ruby
fuente
(
,[
o{
Puede tener código en la definición de clase en Ruby y Python. Sin embargo, en Ruby tienes una referencia a la clase (self). En Python no tiene una referencia a la clase, ya que la clase aún no está definida.
Un ejemplo:
self en este caso es la clase, y este código imprimirá "Kaka". No hay forma de imprimir el nombre de la clase o de otra manera acceder a la clase desde el cuerpo de definición de clase en Python.
fuente
class
declaración.La sintaxis no es algo menor, tiene un impacto directo en cómo pensamos. También tiene un efecto directo sobre las reglas que creamos para los sistemas que utilizamos. Como ejemplo, tenemos el orden de las operaciones debido a la forma en que escribimos ecuaciones u oraciones matemáticas. La notación estándar para las matemáticas permite a las personas leerla de más de una manera y llegar a diferentes respuestas dada la misma ecuación. Si hubiéramos utilizado la notación de prefijo o postfijo, habríamos creado reglas para distinguir cuáles eran los números a manipular en lugar de tener solo reglas para el orden en que se calculan los valores.
La notación estándar deja en claro de qué números estamos hablando al tiempo que hace que el orden en el que se calculan sea ambiguo. La notación de prefijos y postfijos hace que el orden en el que se compute sea simple mientras que los números son ambiguos. Python ya tendría lambdas multilínea si no fuera por las dificultades causadas por el espacio en blanco sintáctico. (Existen propuestas para lograr este tipo de cosas sin agregar necesariamente delimitadores de bloque explícitos).
Me resulta más fácil escribir condiciones en las que quiero que ocurra algo si una condición es falsa, es mucho más fácil escribir con la declaración a menos en Ruby que la construcción semánticamente equivalente "si no" en Ruby u otros idiomas, por ejemplo. Si la mayoría de los idiomas que la gente usa hoy en día tienen el mismo poder, ¿cómo puede considerarse que la sintaxis de cada idioma es algo trivial? Después de características específicas como bloques y mecanismos de herencia, etc., la sintaxis es la parte más importante de un lenguaje, apenas algo superficial.
Lo superficial son las cualidades estéticas de la belleza que atribuimos a la sintaxis. La estética no tiene nada que ver con cómo funciona nuestra cognición, la sintaxis sí.
fuente
Sorprendido de no ver nada del mecanismo de "método perdido" de Ruby. Daría ejemplos de los métodos find_by _... en Rails, como un ejemplo del poder de esa característica del lenguaje. Supongo que algo similar podría implementarse en Python, pero que yo sepa no está allí de forma nativa.
fuente
method_missing
puede ser emulado en Python en algunos casos:class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()
. Sin embargo, existen pequeñas diferencias y dudo que sea idiomático en Python :-)El problema del generador de acumuladores de Paul Graham demuestra otra diferencia en lambdas entre Python y Ruby . Reimpreso aquí:
En Ruby, puedes hacer esto:
En Python, crearía un objeto para mantener el estado de n:
Algunas personas podrían preferir el enfoque explícito de Python como más claro conceptualmente, incluso si es un poco más detallado. Almacena el estado como lo hace para cualquier otra cosa. Solo necesita comprender la idea de los objetos invocables. Pero independientemente de cuál enfoque prefiera estéticamente, muestra un respeto en el que las lambdas de Ruby son construcciones más poderosas que las de Python.
fuente
def foo(n): def f(i): return n + i return f
.def foo(n): L=[n] def f(i): L[0] += i return L[0] return f
. En Python3 podría usar lanonlocal
palabra clave.Python ha nombrado argumentos opcionales
AFAIK Ruby solo ha posicionado argumentos porque b = 2 en la declaración de función es una afectación que siempre se agrega.
fuente
def my_method(param1, optional = false)
funciona en Ruby 1.8.6, 1.8.7 y presumiblemente 1.9!b
parámetro en lafunc
llamada y aún mantiene su valor predeterminado. Es decir,b
es el segundo argumento en la firma, pero puede omitirlo al prefijar el segundo parámetro conc=
. Ruby usa hashes para simular esto, pero no es exactamente lo mismo.Ruby tiene documentación incrustada:
fuente
http://c2.com/cgi/wiki?PythonVsRuby
http://c2.com/cgi/wiki?SwitchedFromPythonToRuby
http://c2.com/cgi/wiki?SwitchedFromRubyToPython
http://c2.com/cgi/wiki ? UsingPythonDontNeedRuby
http://c2.com/cgi/wiki?UsingRubyDontNeedPython
fuente
Con Cargo puede " requerir bibliotecas sin saturar su espacio de nombres ".
fuente