2009-11-28 25 views
12

He estado leyendo mucho sobre Ruby en los últimos días. Cada mensaje SO que encuentro me dice que el rubí es un lenguaje elegante. ¿Pueden darme un ejemplo de por qué el rubí es elegante en comparación con otro idioma?¿Qué hace que Ruby sea un lenguaje elegante?

+0

Similar: http://stackoverflow.com/questions/1589841/what-does-it-mean-when-someone-says-that-perl-is-more-expressive-lanaguage –

Respuesta

17

Se considera elegante porque es ortogonal . Esa es una forma elegante de decir que operaciones similares se aplican a operandos similares.

Ejemplo simple: + en enteros los agrega; en números de coma flotante, ídem. En enteros grandes, también. En cadenas, las concatena (lo cual también esperarías). Ahora bien, este no es un gran problema para +, esperas que sea de un lenguaje de programación decente. Pero existen operaciones como map o filter, funcionan en listas (¡deben!) Pero también funcionan en matrices y, de hecho, en cualquier cosa que pueda enumerarse o repetirse.

Me gusta cómo funciona la indexación de matriz (o lista), puede usar índices enteros positivos para indexar desde el inicio, o índices negativos para especificar una posición desde el final de la estructura, puede especificar un rango para extraer un subconjunto ... esto también funciona para listas, matrices y (sub) cadenas. Funciona en el lado derecho de una tarea (=), también funciona en el lado izquierdo (puede asignar una subcadena, reemplazando así parte de una cadena). Por lo tanto, no necesita una función substring_replace, simplemente aprovecha un concepto general existente.

El autor de Ruby expresó esto en términos de satisfacer las expectativas del usuario (es decir, del programador): debería haber tan pocas sorpresas como sea posible, siempre que el sentido común lo lleve a esperar que algo funcione de cierta manera, simplemente debería. Trabajó muy duro para satisfacer este requisito. Además, mientras Ruby toma prestado un poco de Perl, el autor no está de acuerdo con el principio de Perl TMTOWTDI a favor del Zen de Python: "Debería haber una – y preferiblemente una sola – manera obvia de hacerlo".

También es bueno que Ruby haga cierres (= bloques de código) para que pueda especificar una función simplemente envolviéndola en un par de llaves. Hay lugares donde es apropiado especificar una función en línea, y Ruby te permite hacerlo cómodamente.

Ruby te permite hacer cosas con una pequeña cantidad de codificación porque sus construcciones se combinan de manera poderosa. Incursiono en Project Euler y encuentro que a menudo las soluciones más cortas legibles y comprensibles se hicieron en Ruby.Los más cortos están en J, pero ese es un dialecto APL y para los no iniciados parece ruido de línea.

Mi experiencia personal confirma esto: aprendí Ruby and Rails y escribí una aplicación web con análisis de datos de complejo medio en una semana. Cada principio que aprendí, pude aplicar en diferentes lugares con datos diferentes – It Just Works ™!

+0

DESCARGO DE RESPONSABILIDAD: Podría estar confundido con los detalles en mi respuesta anterior, ya que no estoy usando activamente a Ruby en este momento. Si tengo algo mal, házmelo saber y lo arreglaré. Me encantó Ruby hace algunos años por dicha elegancia, pero se apagó porque la implementación de referencia fue lenta. Mientras tanto, está JRuby, tan rápido como Java, y lo consideraría para mi próximo proyecto. –

+4

Ortogonal en un contexto informático significa libre de efectos secundarios, por lo que, por ejemplo, la modificación de un componente no afecta a los componentes dependientes. –

+1

De la Wikipedia: "Se dice que un conjunto de instrucciones es ortogonal si cualquier instrucción puede usar cualquier registro en cualquier modo de direccionamiento". - esta es la connotación en la que basé mi discusión. Estoy de acuerdo en que esto no está del todo claro, y es por eso que tuve que continuar con un montón de discursos que agitaban la mano. –

1

Todo es un objeto (ps como en Smalltalk ...):

3.times { p "olleh" } 

clases extensibles/abrir (por ejemplo, de los carriles):

10.days_ago 

.. y más en elegancia rubí: http://www.benhughes.name/files/presentations/ruby_elegance.pdf

+0

Hmmm..Me pregunto qué es esto la paz del código? – Luke101

+2

por lo tanto smalltalk es elegante también? –

+0

@ Luke101: imprime "olleh" 3 veces. – sepp2k

4

Ruby y DSL ha sido discussedalot.

Ejemplo de sinatra:

get '/' do 
    'Hello world!' 
end 

o desde este blog:

ChessGame.new do |move| 
    move.black_pawn(forward) 
    move.white_pawn(forward) 
    #… 
    move.white_queen(pwn_king) 
end 
5
  • tener clases abiertas es decir, puede agregar métodos a clases después de haberse definido
  • tener method_missing es decir, la posibilidad de manejar los casos en los que estás enviar un mensaje no se ha definido un método para. De nuevo, esto le permite escribir código que se adapta en lugar de simplemente colgarse.
  • teniendo una Smalltalk-like, OO modelo consistente p. puedes hacer cosas como 1.class 1.times {}. Esto hace posible una gran cantidad de soporte DSL.
  • ha bloques/cierres - hace que sea mucho más fácil escribir código flexibles
  • que no pierde su tiempo con tipos estáticos de cada variable (es decir, tratando de resolver los problemas que no son importantes si hacer TDD)
  • usted no tiene que usar basado en la clase OO es decir que apoya la programación orientado a objetos basado en prototipos
2

puede que no sea capaz de argumentar que es elegante, creo que en general la elegancia se deriva de la impl del programador ementación. Sin embargo, puedo argumentar que es conciso y creo que eso es lo que realmente siente mucha gente cuando dice que Ruby es elegante. Muchas veces el código que se une rápidamente se siente elegante.

Puede ver los resultados del tiroteo del lenguaje de programación here. Notarás que Ruby 1.9 está chamuscado contra el lado izquierdo, lo que significa que es súper conciso. Apostaría a que cualquiera que hable de que un lenguaje es elegante está hablando de un idioma que está en el lado izquierdo o cercano. Haskell es una de las únicas excepciones notables que conozco, que requiere un gran esfuerzo para hacer ciertas cosas, pero aún así se siente extremadamente elegante al hacerlo.

+1

Si quieres enfocarte solo en Code-used, configura tus propios parámetros para una clasificación como esta - http://shootout.alioth.debian.org/u32/fun.php?d=data&calc=calculate&xfullcpu=0&xmem=0&xloc= 1 & binarytrees = 1 & chameneosredux = 1 & fannkuch = 1 & fasta = 1 & knucleotide = 1 & mandelbrot = 1 & meteor = 0 & nbody = 1 & pidigits = 1 & regexdna = 1 & revcomp = 1 & spectralnorm = 1 & threadring = 0 – igouy

5

En mi experiencia, los bloques son el mayor factor que contribuye a que Ruby sea elegante. lo que es más elegante que la escritura de cada iterar sobre matrices/hash/etc ...

arr = ["one", "two", "three"] 
arr.each { |e| 
    puts e 
} 

Sin embargo, creo que es más de esto, la elegancia del lenguaje Ruby también proviene de las bibliotecas. La mayoría de las bibliotecas se han limitado a utilizar el 'estilo' Ruby único para nombres de funciones, como 'cada' para iteración o el uso de '!' y '?' al final de los nombres de funciones para las funciones de retorno destructivo/booleano, esto es lo que realmente mantiene Ruby 'elegante'.

4

Rubí tiene que ver con la productividad y la diversión de programación, sin embargo, hay varias razones por las que Ruby es elegante:

  • programación orientada a objetos puro: todo es un objeto, por lo que no tiene que distinguir entre primitivo y tipos de objetos .
  • Es compatible con los paradigmas de programación funcional e imperativa: eso conduce a un código conciso y legible.
  • Es compatible con Principle of Least Surprise: que admite legibilidad.
  • Tiene cierres y bloques: que es realmente fresco para hacer Internal DSLs.
  • Tiene una robusta Metaprogramming API: que faculta a escribir DSL internos también.
  • es muy bueno en las tareas de secuencias de comandos: el manejo de archivos de texto y xml y haciendo cosas relacionadas con la administración (que está siendo ampliamente utilizado por los administradores de sistemas hoy en día).
  • Tiene una comunidad muy fresco y de apoyo: encontrará apoyo y ayudar a cualquiera que sea su problema. Esta comunidad admite técnicas de codificación modernas y de moda, así como TDD y BDD.

La suma de todo lo anterior es que el uso de Ruby se puede tener:

  • código conciso: En comparación con Java y C++, al menos se puede ahorrar un 50% de escribir código.
  • Readablility.

lo tanto tener un código legible y conciso -> menos código para escribir -> menos código para probar y mantener ->Productividad.

No hay que olvidar mencionar la gran comunidad de apoyo detrás de Ruby.

0

Sólo una nota al margen divertida: this feels like php pero es Ruby (de hoy), pero la primera respuesta se siente elegante Ruby. En PHP, terminé escribiendo código estúpido como la publicación vinculada para hacer pequeñas cosas. En parte porque las lambdas son básicamente inexistentes. Así que tendría que decir que el soporte lambda de Ruby junto con map/reduce es lo que lo hace elegante para mí.

Cuestiones relacionadas