【问题标题】:Execute ruby method from command-line从命令行执行 ruby​​ 方法
【发布时间】:2016-04-14 01:06:07
【问题描述】:

我在 test_class.rb 文件中有以下 Ruby 类:

class TestClass

   def test_verify_one
         # DO SOME
   end

   def test_verify_two
         # DO SOME
   end

end

为了执行这个类,我向终端发送了两个参数,ENVIRONMENT 和 LANGUAGE。

所以...从我使用的终端调用:

ruby test_class.rb ENVIRONMENT LANGUAGE

这会执行这两种方法。

我只想执行一个。

我尝试了以下方法:

ruby -r "test_class.rb" -e "TestClass.test_verify_one" ENVIRONMENT LANGUAGE

但它不起作用。

你能帮帮我吗?

【问题讨论】:

  • def self.name_of_method的问题???
  • “这两种方法都执行” - 不,它没有,给定您显示的代码。这里没有执行任何操作。
  • @SergioTulentsev,你是对的......这是我为了尝试新方法而添加的。我更新了代码。
  • 仍然不会执行任何代码。
  • @Sergio 的意思是,要执行您的代码,您需要在类定义后添加如下行:t = TestClass.new; t.test_verify_one; t.test_verify_two

标签: ruby command-line command-line-arguments


【解决方案1】:

在与test_class.rb 相同的文件夹中,使用以下命令语法运行ruby 命令:

ruby -I . -r "test_class" -e "TestClass.test_verify_one" arg1 arg2

分解这个命令我们得到:

-I . 在 $LOAD_PATH 中包含当前目录,以便我们可以使用 require

-r 在 $LOAD_PATH 中需要一个名为 test_class 的文件。这是可能的,因为我们在上面的加载路径中包含了当前目录(.rb 扩展名在这里是可选的)。

-e 与您提供的相同,计算以下代码。

现在,如果我们在该方法中调用 ARGV,我们应该在不同的行中获得 arg1arg2

#...
def self.test_verify_one
  puts ARGV
end
#...

【讨论】:

  • 谢谢@Anthony E 现在我遇到了这个问题:-e:1:in
    ': undefined method test_verify_one' for TestClass:Class (NoMethodError)
  • 您的原始问题是否使用了类方法?在您的情况下,它将是-e TestClass.new.test_verify_one。在这里使用类方法还是实例方法都没关系
  • 我做了@Anthony,我尝试了ruby -I . -r "test_class" -e "TestClass.new.test_verify_one" arg1 arg2ruby -I . -r "test_class" -e "TestClass.new(test_verify_one)" arg1 arg2,但我得到:C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/test-unit-3.0.8/lib/test/unit/testcase.rb:400:in initialize':参数数量错误(0 代表 1)(ArgumentError)来自 -e :1:in new' from -e:1:in
    '`
  • 您的 test_class 文件名可能与 ruby​​ 的核心类之一发生冲突。尝试将您的文件和类重命名为其他名称。
【解决方案2】:

如果您希望您的第一个方法采用您传递给它的变量,您需要定义您的第一个方法来采用两个变量,如下所示:

class TestClass

    def test_verify_one (var1, var2)
             # DO SOME
       end

       def test_verify_two
             # DO SOME
       end

end

然后,您需要在第二个条件中添加一个条件,使其仅在您希望它执行的条件下执行......或者如果您目前不需要它,只需将其注释掉。因此,例如,如果您只想在未传入变量时触发测试 2,您的代码将如下所示:

class TestClass

    def test_verify_one (var1, var2)
        # DO SOME
    end

    def test_verify_two (var1, var2)
        if (var1 and var2) defined? nil
        # DO SOME
    end

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2012-07-15
    • 2017-07-04
    • 2019-08-04
    • 1970-01-01
    • 2011-06-15
    • 2015-12-06
    相关资源
    最近更新 更多