【问题标题】:What does *args mean? [duplicate]*args 是什么意思? [复制]
【发布时间】:2014-02-24 16:42:09
【问题描述】:

args是什么意思,如果有区别,它和ARGV有什么区别?

 def puts_two(*args)
    arg1, arg2 = args
    puts "arg1: #{arg1}, arg2: #{arg2}"
    end

【问题讨论】:

    标签: ruby


    【解决方案1】:

    * 被称为 splat 运算符。在*args 这里* 创建一个数组,其中所有参数都发送到方法puts_two,并且args 作为局部变量保存对数组的引用。以更清晰的方式 - splat 运算符用于处理具有可变参数列表的方法(即排列你的参数)。

    ARGV 包含传递给脚本的参数,每个元素一个。

    例如:

    $ ruby argf.rb -v glark.txt
    

    argf.rb文件中,你会得到如下:

    ARGF.argv   #=> ["-v", "glark.txt"]
    

    【讨论】:

      【解决方案2】:

      这在 Ruby 中被称为“splat 运算符”。有关不同用途,请参阅以下文章:

      The Strange Ruby Splat

      在方法定义中,它基本上只是将所有剩余参数收集到一个数组中(请注意,从 Ruby 2.0 开始,还可以使用 **kwargs 之类的东西收集关键字 args)。

      【讨论】:

        【解决方案3】:

        ARGV 是 Ruby 中的一个特殊变量。它包含在命令行上传递给脚本的参数。例如,如果您在名为 test.rb 的文件中编写以下代码:

        ARGV.each do |a|
            puts a
        end
        

        然后这样称呼它

        c:\> ruby test.rb one two
        

        会显示

        one
        two
        

        在您发布的代码中,*args 只是表示该方法接受名为args 的数组中的可变数量的参数。它可以被称为任何你想要的(当然,遵循 Ruby 命名规则)。

        所以在这种情况下,argsARGV 完全无关。

        【讨论】:

          【解决方案4】:

          在这种情况下,*args 和 ARGV 彼此无关。在您的示例中:

          def puts_two(*args)
              arg1, arg2 = args
              puts "arg1: #{arg1}, arg2: #{arg2}"
          end
          

          *args 只是传递给方法 puts_two 的参数。 * 是“splat”运算符,这意味着可以将任意数量的参数传递给该方法,并将它们“splatted”到一个数组中。因此,如果您使用以下方式调用它:

          puts_two('一', '二', '三')

          args 将是一个类似于 ['one', 'two', 'three'] 的数组。

          请注意,在分配变量 arg1 和 arg2 时,只会使用数组的前 2 个元素,因此使用我上面的示例

          arg1, arg2 = ['one', 'two', 'three']
          
          arg1 => 'one'
          arg2 => 'two'
          

          ARGV 只是从命令行传递给 ruby​​ 脚本的参数。

          【讨论】:

            猜你喜欢
            • 2010-09-22
            • 1970-01-01
            • 2019-11-23
            • 1970-01-01
            • 2019-09-12
            • 2015-01-22
            • 2012-01-03
            • 2020-10-27
            • 2015-07-15
            相关资源
            最近更新 更多