2012-04-25 13 views
40

¿Cómo puedo llamar directamente a una función de ruby ​​desde la línea de comandos?Llamar a la función de ruby ​​desde la línea de comandos

Imagínese, me gustaría tener este script test.rb:

class TestClass 
    def self.test_function(some_var) 
     puts "I got the following variable: #{some_var}" 
    end 
end 

Si este script se ejecuta desde la línea de comandos (ruby test.rb), no pasa nada (como estaba previsto).

¿Hay algo así como ruby test.rb TestClass.test_function('someTextString')? Quiero obtener la siguiente salida: I got the following variable: someTextString.

Respuesta

74

Primero, el nombre de la clase debe comenzar con una letra mayúscula, y como realmente desea utilizar un método estático, la definición del nombre de la función debe comenzar por self..

class TestClass 
    def self.test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

Luego de invocar que a partir de la línea de comandos que puede hacer:

ruby -r "./test.rb" -e "TestClass.test_function 'hi'" 

Si por el contrario tenía test_function como un método de instancia, tendría que:

class TestClass 
    def test_function(someVar) 
     puts "I got the following variable: " + someVar 
    end 
end 

entonces lo invocaría con:

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'" 
+9

+1 :). También. CamelCase para métodos y nombres de variables no son de estilo Ruby. Use undersore: 'test_function',' some_var' – fl00r

+0

@ fl00r ¡Buen punto! Actualicé la respuesta. – Candide

+0

Consulte [respuesta de @lunero] (http://stackoverflow.com/a/37948278/1245614) para obtener varios parámetros – skitheo

2

Si está trabajando en una interfaz de línea de comando, le sugiero echar un vistazo a thor.

Thor asigna directamente sus comandos a métodos dentro de la clase definida; consulte thor wiki para ver un ejemplo.

11

Aquí hay otra variación, si encuentras que escribir la sintaxis de ruby ​​en la línea de comando es incómodo y realmente solo quieres pasar args a ruby. Aquí es test.rb:

#!/usr/bin/env ruby 

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
end 

TestClass.test_function(ARGV[0]) 

Hacer test.rb ejecutable y ejecutarlo así:

./test.rb "Some Value" 

o bien puede hacerlo de esta manera:

ruby test.rb "Some Value" 

Esto funciona porque rubí ajusta automáticamente la ARGV array a los argumentos pasados ​​al script. Puede usar ARGV[0] o ARGV.first para obtener el primer argumento, o puede combinar los argumentos en una sola cadena, separados por espacios, usando ARGV.join(' ').

Si está haciendo muchas cosas en la línea de comandos, es posible que finalmente tenga un uso para Shellwords, que está en la lib de ruby ​​estándar.

+1

Normalmente, debe ajustar el código de nivel superior en 'if __FILE__ == $ 0'. –

3
#!/usr/bin/env ruby 

class A 
    def run 
    p :Hello_world 
    end 
    self 
end.new.run 

La forma habitual de escritura de rubí es simplemente usar el entorno de ejecución de nivel superior llamada principal. Puede simplemente comenzar a definir los métodos y el código que escribe fuera de una clase, y estos se ejecutarán directamente. (Por cierto, el código dentro de una clase pero fuera de cualquier método se ejecutará "solo" también.)

De todos modos, estoy contigo ... Me gusta escribir todo el código en una clase con nombre y crear una instancia de esa clase, por lo que puedes combinar las técnicas ... hacer que la clase devuelva su propio objeto ... y luego usar solo un poco de ese código de nivel superior para asignar, inicializar y luego insertar puntos en la clase.

Con esto, puede simplemente escribir $ ruby test.rb y hará lo que quiera. O puede chmod +x test.rb; ./test.rb ya que lo hicimos add a shebang.

0

Simplemente una extensión a la respuesta de Ingenu para el caso de que la función no imprima algo, pero devuelve algo.

tendríamos el siguiente test.rb

class TestClass 
    def self.test_function(some_var) 
     return "I got the following variable: " + some_var 
    end 
end 

para invocar a continuación que, desde la línea de comandos y obtener el valor de retorno:

ruby -r "./test.rb" -e "puts TestClass.test_function('hi')" 
2

Si tiene varios argumentos para llamar en caso un ejemplo como este:

class TestClass 
    def self.test_function(some_var1, some_var2) 
    puts "I got the following variables: #{some_var1}, #{some_var2}" 
    end 
end 

run it like thi s (los argumentos tienen que ser separados por comas en este caso)

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'" 
+0

esto es genial porque la respuesta inicial no cubrió 2 argumentos. – camdixon

0

Si sabe que la forma de llamar a un archivo rb de comandos

Esto se puede hacer todo el truco para ti.

Lo que ha hecho es, acaba de definir sus métodos en la clase. Ahora puede llamarlo debajo de la definición. Si aún quieres leer, abre los ojos de par en par

class TestClass 
    def self.test_function(some_var) 
    puts "I got the following variable: #{some_var}" 
    end 
    test_function(var) 
end 
Cuestiones relacionadas