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
.
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'"
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.
#!/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.
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'"
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
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')"