【问题标题】:Ruby assign more than one arguments from terminalRuby 从终端分配多个参数
【发布时间】:2016-04-22 11:20:50
【问题描述】:

我正在使用终端并通过以下方式在 ruby​​ 文件 hello_world.rb 上分配多个变量:

$ ruby hello_world.rb arg1 arg2 arg3 arg4

如果我放了

$ ruby hello_world.rb hello world mars jupiter

我需要它来显示

hello world
hello mars 
hello jupiter

如果我放了

$ ruby hello_World.rb whaddup boy girl

需要显示

whaddup boy
whaddup girl

第一个参数将是第一个字符串,其余参数将分别列为第二个字符串。

我能够创建代码:

def hello_world(first, *second)
    second.each do |arg|
        puts "#{first} #{arg}"
    end
end

但是当我从终端运行$ ruby hello_world.rb hello world mars 时,它不会显示任何内容。我想我必须使用 ARGV。我只知道如何处理一个论点,

def hello_world
    ARGV.each do |arg|
        puts "Hello #{arg}"
    end
end

hello_world

终端:

$ ruby hello_world.rb world mars jupiter
#=> Hello world
#=> Hello mars
#=> Hello jupiter

如果有两个或更多参数,我不知道该怎么做。任何帮助都感激不尽。谢谢!

【问题讨论】:

    标签: ruby command-line terminal arguments argv


    【解决方案1】:

    ARGV 常量只是一个数组,因此您可以执行以下操作,例如:

    def hello_world
      first = ARGV.shift
      puts ARGV.map { |arg| "#{first} #{arg}" }
    end
    
    hello_world
    

    Array#shift 方法将删除并返回数组的第一个元素。在这种情况下,第一个参数从命令行传递。

    输出:

    $ ruby hello_world.rb hello world mars
    #=> hello world
    #=> hello mars
    

    【讨论】:

      【解决方案2】:

      您需要做的就是使用您的第一个 hello_world 方法,但使用 ARGV 的元素调用它,而不是 ARGV 本身,并使用 splat:

      def hello_world(first, *second)
          second.each do |arg|
              puts "#{first} #{arg}"
          end
      end
      
      hello_world *ARGV
      # ..........^
      

      记录在http://ruby-doc.org/core-2.2.3/doc/syntax/calling_methods_rdoc.html#label-Array+to+Arguments+Conversion

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 2011-08-14
        • 2023-03-11
        • 2014-10-12
        • 1970-01-01
        • 2014-06-03
        相关资源
        最近更新 更多