it-swarm.com.de

Rufen Sie die Ruby-Funktion über die Befehlszeile auf

Wie kann ich eine Ruby-Funktion direkt von der Befehlszeile aus aufrufen?

Stellen Sie sich vor, ich hätte dieses Skript test.rb :

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

Wenn dieses Skript über die Befehlszeile (Ruby test.rb) ausgeführt wird, geschieht nichts (wie beabsichtigt).

Gibt es so etwas wie Ruby test.rb TestClass.test_function('someTextString')? Ich möchte folgende Ausgabe erhalten: I got the following variable: someTextString.

44
user1251007

Zunächst muss der Name der Klasse mit einem Großbuchstaben beginnen, und da Sie wirklich eine statische Methode verwenden möchten, muss die Definition des Funktionsnamens mit self. beginnen.

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

Dann können Sie das von der Kommandozeile aus aufrufen:

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

Wenn Sie stattdessen test_function als Instanzmethode hätten, hätten Sie:

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

dann würden Sie es mit aufrufen:

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

Hier ist eine weitere Variante, wenn Sie feststellen, dass die Eingabe der Ruby-Syntax in der Befehlszeile unpraktisch ist und Sie die Argumente wirklich nur an Ruby übergeben möchten. Hier ist 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])

Machen Sie test.rb ausführbar und führen Sie es folgendermaßen aus:

./test.rb "Some Value"

Oder führe es so aus:

Ruby test.rb "Some Value"

Dies funktioniert, weil Ruby das ARGV-Array automatisch auf die Argumente setzt, die an das Skript übergeben werden. Sie können ARGV[0] oder ARGV.first verwenden, um das erste Argument abzurufen, oder Sie können die Argumente mit ARGV.join(' ') in einer durch Leerzeichen getrennten Zeichenfolge kombinieren.

Wenn Sie viele Befehlszeilenfunktionen ausführen, haben Sie möglicherweise eine Verwendung für Shellwords , die sich in der Standard-Ruby-Bibliothek befindet.

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

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

Die übliche Art, ein Skript für Ruby zu erstellen, ist die Verwendung der top-level-Ausführungsumgebung mit dem Namen main. Sie können einfach damit beginnen, Methoden und Code zu definieren, die Sie außerhalb einer Klasse schreiben. Diese werden direkt ausgeführt. (Übrigens, Code innerhalb einer Klasse, aber außerhalb jeder Methode wird auch "von selbst" ausgeführt.)

Wie auch immer, ich bin bei dir ... Ich schreibe gerne den gesamten Code in einer benannten Klasse und instanziiert diese Klasse, so dass Sie die Techniken kombinieren können. Lassen Sie die Klasse ihr eigenes Objekt zurückgeben .. und verwenden Sie dann nur ein wenig von diesem Top Level-Code zum Zuordnen, Initialisieren und dann Einfügen in die Klasse.

Mit diesem können Sie einfach $ Ruby test.rb eingeben und es wird tun, was Sie wollen. Oder Sie können chmod +x test.rb; ./test.rb, da wir einen Shebang hinzugefügt haben.

3
DigitalRoss

Wenn Sie mehrere Argumente in einem Beispiel wie dem folgenden aufrufen möchten:

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

führen Sie es so aus (die Argumente müssen in diesem Fall durch Kommas getrennt werden)

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

Wenn Sie an einer Befehlszeilenschnittstelle arbeiten, würde ich empfehlen, einen Blick auf thor zu werfen.

Thor ordnet Ihre Befehle direkt Methoden innerhalb der definierten Klasse zu. Ein Beispiel finden Sie im thor wiki .

2
NilsHaldenwang

Wenn Sie wissen, wie Sie eine rb-Datei von der Kommandozeile aus aufrufen 

Ruby yourfile.rb

Dies kann den ganzen Trick für Sie tun.

Was Sie getan haben, ist nur Ihre Methoden in der Klasse definiert. Jetzt können Sie es unterhalb der Definition aufrufen. Wenn Sie noch lesen möchten, öffnen Sie Ihre Augen

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

Eine Erweiterung der Antwort von Ingenu für den Fall, dass die Funktion etwas nicht druckt, sondern etwas zurückgibt.

Wir hätten folgendes test.rb

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

Dann rufen Sie das von der Kommandozeile auf und erhalten den Rückgabewert:

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