53

コマンドラインから ruby​​ 関数を直接呼び出すにはどうすればよいですか?

想像してみてください、私はこのスクリプトtest.rbを持っているでしょう:

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

このスクリプトをコマンドライン ( ruby test.rb) から実行すると、(意図したとおり) 何も起こりません。

のようなものはありruby test.rb TestClass.test_function('someTextString')ますか?次の出力を取得したい: I got the following variable: someTextString.

4

7 に答える 7

99

まず、クラスの名前は大文字で始める必要があり、実際には静的メソッドを使用したいので、関数名の定義は で始める必要がありself.ます。

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

次に、コマンドラインからそれを呼び出すには、次のようにします。

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

代わりにtest_functionインスタンス メソッドとして持っていた場合は、次のようになります。

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

次に、次のように呼び出します。

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi'"
于 2012-04-25T13:28:22.897 に答える
15

コマンド ラインで ruby​​ 構文を入力するのが面倒で、本当に引数を ruby​​ に渡したいだけの場合は、別のバリエーションを次に示します。ここに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])

test.rb を実行可能にして、次のように実行します。

./test.rb "Some Value"

または、次のように実行します。

ruby test.rb "Some Value"

これが機能ARGVするのは、スクリプトに渡された引数に ruby​​ が自動的に配列を設定するためです。ARGV[0]orを使用ARGV.firstして最初の引数を取得するか、 ARGV.join(' ').

多くのコマンドライン操作を行っている場合、最終的には、標準の ruby​​ ライブラリにあるShellwordsを使用できるようになる可能性があります。

于 2012-04-25T13:59:26.240 に答える
3
#!/usr/bin/env ruby

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

Ruby をスクリプト化する通常の方法は、mainと呼ばれる最上位の実行環境を使用することです。クラス外で記述したメソッドとコードの定義を開始するだけで、これらは直接実行されます。(ところで、クラス内のコードはメソッド外でも「単独で」実行されます。)

とにかく、私はあなたと一緒です...私はすべてのコードを名前付きクラスに記述し、そのクラスをインスタンス化するのが好きなので、テクニックを組み合わせることができます..クラスに独自のオブジェクトを返させます..そしてそのトップのほんの少しを使用しますクラスに割り当て、初期化、およびドットするレベル コード。

これにより、入力するだけで、必要なこと$ ruby test.rbが実行されます。または、シバンを追加したchmod +x test.rb; ./test.rbのでできます。

于 2012-04-25T16:01:34.253 に答える
2

コマンド ライン インターフェイスで作業している場合は、thorを参照することをお勧めします。

Thor は、定義されたクラス内のメソッドにコマンドを直接マップします。例については、Thor wikiを参照してください。

于 2012-04-25T13:44:23.800 に答える
2

関数が何かを出力しないが、何かを返す場合の Ingenu の回答の単なる拡張です。

次のtest.rbがあります

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

次に、コマンドラインからそれを呼び出して戻り値を取得します。

ruby -r "./test.rb" -e "puts TestClass.test_function('hi')"
于 2012-04-25T21:19:30.050 に答える