Pregunta

¿Es que soy un novato que está aprendiendo Ruby, o realmente tiene más formas de escribir (las mismas) cosas que Java / C #? Además, si es más flexible que Java, ¿hay alguna característica lingüística de Ruby que generalmente se no use para evitar confusiones?

¿Los ejemplos podrían ser asignaciones paralelas y todas las diferentes formas de escribir cadenas, quizás?

Nota: No estoy pidiendo una comparación con Java / C # ... solo esta pregunta de idioma, por favor ...

Editar: entiendo que C #, Java y Ruby tienen una tipificación fuerte, y que solo Ruby (como Python y otros) está tipificada dinámicamente (mientras que Java / C # está tipificada de manera estática). Algunas de las respuestas dicen que los lenguajes de tipo dinámico son más flexibles. ¿Esto es necesariamente cierto y cómo afecta la sintaxis? Solo pregunto sobre la flexibilidad sintáctica.

(PHP también se escribe de forma dinámica y no parece más flexible que Java / C #, por lo que he visto. Nuevamente, quiero decir en términos de sintaxis, no en términos de implementación ni ningún otro aspecto ...)

¿Fue útil?

Solución

No sé Java o C #, pero permito que el hecho de que puedas redefinir cómo + funciona en los números hable por sí mismo.

Otros consejos

En cuanto a mí, las funciones más utilizadas en Ruby y las que faltan en Java son los bloques de código / lambdas / cierres.

Otra característica excelente (pero tal vez peligrosa) son las clases abiertas: puedes cambiar la clase que desees: agregar un método nuevo, cambiar el antiguo, etc. Incluso puedes agregar un método a un objeto específico, no a toda la clase:).

Otro lenguaje dinámico que es bastante similar a Ruby es Python. Sin embargo, en el Zen of Python , una de las reglas dicta que " ; debe haber una, y solo una, forma de hacer algo " ;. Este es un polo opuesto a Ruby, que permite tanta meta-programación que esencialmente hay un número infinito de formas de hacer lo mismo.

Dicho esto, es un tanto irónico que hasta la cadena de Python 3.0 (aka: 3000) y los valores de Unicode eran tipos diferentes. Si bien tiene sentido, las personas a veces se meten en problemas en los que están convirtiendo mucho entre los dos para realizar operaciones de texto.

Si tiene una opción, casi recomiendo usar Python como introducción a los idiomas dinámicos. No hay nada malo con Ruby, pero es posible que te encuentres en menos situaciones en las que " correcto " La forma de hacer algo no es totalmente obvia.

En respuesta a la tipificación dinámica de PHP:

El sistema de tipos de PHP es flexible, lo que permite que los tipos se conviertan automáticamente según el contexto en el que se usan. Sin embargo, esto no hace que los tipos dinámicos sean reales. El lenguaje en sí es en su mayoría estático y no le permitirá agregar atributos a objetos en tiempo de ejecución, por ejemplo (al menos, la última vez que lo verifiqué).

Python, y posiblemente Ruby, en realidad están fuertemente tipados, lo que significa que puedes hacer comparaciones de tipos con confianza, y no puedes hacer trucos de PHP como agregar cadenas numéricas para obtener un número. Los lenguajes dinámicos verdaderos también suelen permitir la metaclasificación donde puede ajustar el tipo de una instancia o clase, o agregar atributos a cualquiera, todo en tiempo de ejecución.

Ruby es un lenguaje dinámico. C # y Java son ambos lenguajes estáticamente tipados con escritura fuerte. C # en v4.0 agregará características dinámicas, pero hasta ahora, Java y C # han tenido un paradigma completamente diferente y más estricto que los lenguajes dinámicos como Ruby y Python.

Comenté en la respuesta de rkj anterior con respecto a lambda. Este código muestra el ejemplo que solicitó;

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

El primer punto a notar es que el método fixed_point maneja la idea general de aplicar progresivamente un proceso a algunos datos hasta que pase una cierta prueba. La función sqrt define el proceso de encontrar una raíz cuadrada y la prueba para determinar cuándo debemos estar satisfechos. Estos 'procedimientos' luego se pasan como cualquier otra forma de datos para que fixed_point pueda funcionar, es mágico.

En lugar de almacenar temporalmente el proceso y probar, todo podría ser anónimo. Podríamos reescribir sqrt como;

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

Sin esta capacidad, tendría que definir tanto el proceso como la prueba como funciones individuales y crear una función especial sqrt_fixed_point para llamarlos. Por lo que sé, Java puede hacer algo similar utilizando Functors pero no sé lo suficiente para comentar. El consenso que he visto en los blogs o similar es que Java hace que esto sea tan terriblemente complicado que tendrás una hemorragia nasal con solo intentarlo.

Por supuesto, otra opción que da Ruby es la metaprogramación. Podría reescribir sqrt para que vuelva a escribir (sobre la marcha) fixed_point usando el proceso y la prueba correctos, pero esto probablemente sea un abuso de la función: -)

ps. El enlace JoelOnSoftware se publica merece ser repetido; http://www.joelonsoftware.com/items/2006/08/01. html

Todos los lenguajes de tipo dinámico (como Ruby) suelen ser más flexibles que los de tipo estático (como Java). No tienes que luchar con el sistema de tipos, que a menudo terminas haciendo en lenguajes de tipo estático.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top