2011-02-05 11 views
9

No estoy seguro de haber visto esto abordado, pero me pregunto cuál es la mejor manera de hacer múltiples requerimientos en un script de ruby. He llegado a un par de ejemplos rudimentarios que describiré a continuación, pero no estoy seguro de si hay una mejor práctica para esto: mis resultados de búsqueda han regresado sin nada.¿Cuál es la mejor manera de hacer múltiples necesidades en Ruby?

0) Manojo de & incluye excepciones (I a dejar el rescate a cabo)

require 'rubygems' 
require 'builder' 

1) Array cadena

torequire = ['rubygems', 'builder'] 
begin 
    torequire.each do |req| 
    require req 
rescue LoadError => e 
    # Not sure if this is great either 
    puts "Missing required gem: " + e.message.split[-1] 
    exit 
end 

2) ??

¿Se ha creado un gran problema al cargarlos todos desde una matriz de cadenas? Podrías especificar los requisitos de la versión o las ubicaciones de manera similar, solo me pregunto si hay algún problema al hacerlo de esta manera.

+1

No dice por qué simplemente hacer "require 'xxx'" parece ser el camino equivocado. ¿Vas a requerir condicionalmente módulos? ¿Tener conjuntos que cargan debido a dependencias mutuas? ¿Diferencias de plataforma? Además, su bloque de "rescate" sirve principalmente para permitir que un script intente ejecutarse incluso si no se cumplen todos los requisitos; esto es más o menos una buena idea. –

+0

Lo siento, dejé la línea de 'salida' que detiene el script, lo editaré. Parece que puedo guardar algunas líneas cuando tengo muchas gemas en un script, si no hay problemas (herramientas de análisis de código, pautas de estilo de código oficial, etc.). – alanp

Respuesta

17

La manera simple es la mejor manera.

usted puede hacer esto, pero negocia la claridad de la inteligencia - un mal negocio:

[ 
    'rubygems', 
    'rack', 
    'rails' 
].each(&method(:require)) 

Saltar el "rescate" con el mensaje de error de fantasía. Todos saben lo que significa cuando un requerimiento arroja un rastro de pila.

Si desea que alguien más que utilice su programa tenga las gemas necesarias instaladas, consulte bundler.

+6

+1 "intercambia claridad por la astucia, una mala negociación", o, como dicen en Spinal Tab, "Hay una delgada línea entre la astucia y la astucia". –

+2

Wow. Si bien nunca infligiría esto a nadie más, ¡eso es realmente inteligente! Para cualquiera que quiera un desglose (y por favor corríjame si estoy equivocado), 'method' devuelve un objeto' Method' y el signo y llama 'to_proc' sobre él, que' each' usa luego como bloque. La firma del método se usa como los parámetros del bloque, lo que convierte a la persona que llama en el destinatario. Es decir, mientras '' 'rubygems'] cada uno (&: require) 'llamaría a' 'rubygems'.require() ',' [' rubygems ']. Cada uno (& method (: require)) 'llamaría' [ 'rubygems']. cada do | dependencia |/* require's implementation */end'. Super ordenado. ¡Gracias! –

10

Todos los scripts de ruby ​​que he visto solo enlistan uno por línea como lo tiene primero.

require 'rubygems' 
require 'rack' 
require 'rails' 
+0

Esto es lo que yo recomendaría también. Es simple, conciso y no demasiado difícil de mirar.Usa rubygems y bundler para administrar gemas en lugar de intentar rodar tu propia solución. – PatrickTulskie

5

En el primero está claro lo que está haciendo.

En el segundo requiere que alguien decodifique lo que está haciendo.

Parece un poco caprichoso obligar a todo el mundo a decodificar lo que está haciendo para que pueda guardar algunas líneas de tipeo (y eso solo si está usando una gran cantidad de bibliotecas en un archivo fuente que es un poco del código huele en sí mismo). Recuerde que el código se lee un orden de magnitud o tres veces más a menudo que está escrito. Si es una elección entre escritura fácil o lectura fácil, la lectura debería ganar.

0
%w(rubygems rack rails).each { |gem| require gem } 

o, con una función reutilizable:

def require_all(gems) ; gems.each { |gem| require gem } ; end 
... 
require_all %w(rubygems rack rails) 

Tampoco es muy popular estilo de Rubí (sobre todo una función de una sola línea), pero Rubí abraza TIMTOWTDI, por lo que los utilizan si trabajan para usted.

Cuestiones relacionadas