web-dev-qa-db-ja.com

Rubyコマンドラインから関数を呼び出す

コマンドラインから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_。

48
user1251007

最初にクラスの名前は大文字で始まる必要があり、静的メソッドを本当に使用したいので、関数名の定義は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'"
88
Candide

コマンドラインで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"
_

これは、Ruby=がARGV配列をスクリプトに渡された引数に自動的に設定するためです。最初の引数を取得するには_ARGV[0]_または_ARGV.first_を使用できます、またはARGV.join(' ')を使用して、スペースで区切られた単一の文字列に引数を組み合わせることができます。

多くのコマンドラインを使用している場合、最終的には標準のRuby libにある Shellwords を使用できます。

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

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

スクリプトを作成する通常の方法Rubyは、トップレベルの実行環境を使用することですmain。クラスの外側で記述するメソッドとコードの定義を開始するだけで、これらは直接実行されます(ところで、クラス内のメソッドはメソッドの外側で実行されます。それ自体」も。)

とにかく、私はあなたと一緒にいます...私は名前付きクラスですべてのコードを書いてそのクラスをインスタンス化するのが好きなので、テクニックを組み合わせることができます..クラスが独自のオブジェクトを返すようにします..クラスに割り当て、初期化してからドットを挿入するレベルコード。

これにより、$ Ruby test.rbと入力するだけで、望みどおりに動作します。または、Shebangを追加 したので、chmod +x test.rb; ./test.rbできます。

3
DigitalRoss

このような例で呼び出す複数の引数がある場合:

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

このように実行します(この場合、引数はコンマで区切る必要があります)

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

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

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

2
NilsHaldenwang

コマンドラインからrbファイルを呼び出す方法を知っている場合

Ruby yourfile.rb

これにより、すべてのトリックを実行できます。

これで、クラスでメソッドを定義しただけです。これで、定義の下で呼び出すことができます。それでも読みたい場合は、目を大きく開けて

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

関数が何かを出力せず、何かを返す場合の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')"
0
user1251007