【问题标题】:Call ruby function from command-line从命令行调用 ruby​​ 函数
【发布时间】:2012-05-06 04:28:52
【问题描述】:

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

【问题讨论】:

    标签: ruby command-line


    【解决方案1】:

    如果你知道如何从命令行调用 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
    

    【讨论】:

      【解决方案2】:
      #!/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,因为我们做了add a shebang.

      【讨论】:

        【解决方案3】:

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

        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'"
        

        【讨论】:

        • 这很好,因为最初的答案没有涵盖 2 个论点。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          首先类名需要以大写字母开头,而且由于确实要使用静态方法,所以函数名定义需要以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'"
          

          【讨论】:

          • +1 :)。还。方法和变量名的 CamelCase 是非 Ruby 风格的。使用鞋底:test_functionsome_var
          • 多个参数见reply by @lunero
          【解决方案6】:

          这是另一种变体,如果您发现在命令行输入 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]ARGV.first 来获取第一个参数,或者您可以使用ARGV.join(' ') 将参数组合成一个字符串,用空格分隔。

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

          【讨论】:

          • 通常你会将顶级代码封装到if __FILE__ == $0
          【解决方案7】:

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

          Thor 直接将您的命令映射到已定义类中的方法,例如,请参阅 thor wiki

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-28
            • 1970-01-01
            • 1970-01-01
            • 2010-09-05
            相关资源
            最近更新 更多