2012-04-25 156 views
40

如何从命令行直接调用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

回答

74

首先,该类的名称需要以大写字母开头,并且由于您确实想使用静态方法,函数名称定义需要以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 

那么你'd援引它:

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

+1 :)。也。用于方法和变量名称的CamelCase是非Ruby风格的。使用undersore:'test_function','some_var' – fl00r 2012-04-25 13:32:14

+0

@ fl00r好点!我更新了答案。 – Candide 2012-05-02 17:15:22

+0

查看[回复人:@lunero](http://stackoverflow.com/a/37948278/1245614)多个参数 – skitheo 2016-12-14 21:03:05

2

如果你正在使用命令行界面,那么我建议看看thor

Thor将您的命令直接映射到定义的类中的方法,有关示例,请参见thor wiki

11

这里有另一种变化,如果你发现在命令行键入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" 

这工作,因为红宝石自动设置ARGV数组添加到传递给脚本的参数。您可以使用ARGV[0]ARGV.first来获取第一个参数,或者您可以使用ARGV.join(' ')将参数组合为一个由空格分隔的字符串。

如果你在做大量的命令行工作,你最终可能会使用Shellwords,它在标准的ruby库中。

+1

通常你会将顶级代码包装到'if __FILE__ == $ 0'中。 – 2012-04-25 18:05:38

3
#!/usr/bin/env ruby 

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

的常用方法脚本Ruby是只使用名为主要的顶级执行环境您可以直接开始定义您在类之外编写的方法和代码,这些将直接执行。 (顺便说一下,类内的代码,但任何方法之外的代码也会“自行”运行。)

不管怎么说,我和你在一起......我喜欢写所有的代码在一个名为类实例化类,所以你可以结合技术..有类回自己的对象..然后只使用一点点的顶级代码分配,初始化,然后点到类中。

有了这个,你可以只输入$ ruby test.rb,它会做你想要什么。或者你可以chmod +x test.rb; ./test.rb因为我们做add a shebang.

0

只是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')" 
2

如果你有多个参数来调用一个这样的例子:

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

运行它像硫S(参数必须是逗号在这种情况下分开)

ruby -r "./test.rb" -e "TestClass.new.test_function 'hi','Mike'" 
+0

这很好,因为最初的答案不包括2个参数。 – camdixon 2017-02-16 20:42:26

0

如果你知道如何从命令行

叫RB文件,这可以为你做的全部伎俩。

你所做的是,只是在课堂上定义你的方法。现在你可以在定义下面调用它。如果你仍然想阅读,睁大你的眼睛

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