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​​ 语法很尴尬,并且您真的只想将 args 传递给 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]orARGV.first来获取第一个参数,或者您可以将 args 组合成一个字符串,用空格分隔,使用ARGV.join(' ').

如果您正在执行大量命令行操作,您最终可能会使用标准 ruby​​ 库中的Shellwords 。

于 2012-04-25T13:59:26.240 回答
5

如果您在这样的示例中有多个参数要调用:

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'"
于 2016-06-21T15:13:56.297 回答
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,因为我们确实添加了一个 shebang。

于 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 回答
2

如果您知道如何从命令行调用 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
于 2017-10-31T12:42:43.703 回答