web-dev-qa-db-fra.com

Appelez la fonction Ruby à partir de la ligne de commande

Comment appeler directement une fonction Ruby à partir de la ligne de commande?

Imaginez, j'aurais ce script test.rb :

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

Si ce script est exécuté à partir de la ligne de commande (Ruby test.rb), rien ne se passe (comme prévu).

Y a-t-il quelque chose comme Ruby test.rb TestClass.test_function('someTextString')? Je veux obtenir le résultat suivant: I got the following variable: someTextString.

44
user1251007

Tout d'abord, le nom de la classe doit commencer par une lettre majuscule et, comme vous voulez vraiment utiliser une méthode statique, la définition du nom de la fonction doit commencer par self..

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

Ensuite, pour appeler cela depuis la ligne de commande, vous pouvez faire:

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

Si vous aviez plutôt test_function comme méthode d'instance, vous auriez:

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

alors vous l'invoqueriez avec:

Ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'"
83
Candide

Voici une autre variante, si vous trouvez que taper la syntaxe Ruby sur la ligne de commande est compliqué et que vous voulez simplement passer les arguments à Ruby. Voici 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])

Assurez-vous que test.rb est exécutable et lancez-le comme ceci:

./test.rb "Some Value"

Ou lancez-le comme ça:

Ruby test.rb "Some Value"

Cela fonctionne car Ruby définit automatiquement le tableau ARGV sur les arguments transmis au script. Vous pouvez utiliser ARGV[0] ou ARGV.first pour obtenir le premier argument ou combiner les arguments en une seule chaîne, séparée par des espaces, à l'aide de ARGV.join(' ').

Si vous faites beaucoup de choses en ligne de commande, vous pourrez éventuellement utiliser Shellwords , qui se trouve dans la bibliothèque standard Ruby.

11
Rob Davis
#!/usr/bin/env Ruby

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

La manière habituelle de scripter Ruby consiste simplement à utiliser l'environnement d'exécution de niveau supérieur appelé main. Vous pouvez simplement commencer à définir des méthodes et du code que vous écrivez en dehors d'une classe. Celles-ci seront exécutées directement. (BTW, le code à l'intérieur d'une classe mais en dehors de toute méthode s'exécutera aussi "tout seul".)

Quoi qu'il en soit, je suis avec vous ... J'aime écrire tout le code dans une classe nommée et instancier cette classe afin que vous puissiez combiner les techniques .. faire en sorte que la classe retourne son propre objet ... code de niveau pour allouer, initialiser, puis dot dans la classe.

Avec cela, vous pouvez simplement taper $ Ruby test.rb et il fera ce que vous voulez. Ou vous pouvez chmod +x test.rb; ./test.rb puisque nous avons ajouter un Shebang.

3
DigitalRoss

Si vous avez plusieurs arguments à appeler dans un exemple comme celui-ci:

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

exécutez-le comme ceci (les arguments doivent être séparés par une virgule dans ce cas)

Ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'"
3
Lunero

Si vous travaillez sur une interface de ligne de commande, je vous conseillerais donc de regarder thor .

Thor mappe directement vos commandes aux méthodes de la classe définie, voir le thor wiki pour un exemple.

2
NilsHaldenwang

Si vous savez comment appeler un fichier rb depuis la ligne de commande 

Ruby yourfile.rb

Cela peut faire l'affaire pour vous.

Ce que vous avez fait est de simplement définir vos méthodes dans la classe. Maintenant, vous pouvez l'appeler ci-dessous la définition. Si vous voulez toujours lire, ouvrez grand les yeux

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

Juste une extension de la réponse d’Ingenu pour le cas où la fonction n’imprime pas quelque chose, mais renvoie quelque chose.

Nous aurions le suivant test.rb

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

Ensuite, pour appeler cela depuis la ligne de commande et obtenir la valeur de retour:

Ruby -r "./test.rb" -e "puts TestClass.test_function('hi')"
0
user1251007