* args是什么意思?

时间:2014-01-31 20:22:39

标签: ruby

args的含义是什么,如果存在差异,它与ARGV之间的区别是什么?

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

4 个答案:

答案 0 :(得分:2)

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

ARGV.each do |a|
    puts a
end

并像这样称呼它

c:\> ruby test.rb one two

将显示

one
two

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

因此,在这种情况下,argsARGV完全无关。

答案 1 :(得分:2)

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

The Strange Ruby Splat

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

答案 2 :(得分:1)

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

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

例如:

$ ruby argf.rb -v glark.txt

argf.rb文件中,您将获得以下内容:

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

答案 3 :(得分:1)

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

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

* args只是传递给方法puts_two的参数。 *是'splat'运算符,这意味着可以将任意数量的参数传递给方法,并将它们“splat”到数组中。所以如果你用:

来调用它

puts_two('one','two','three')

args将是一个看起来像['one','two','three']的数组。

请注意,在变量arg1和arg2的赋值中,只会使用数组的前2个元素,所以使用上面的例子

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

arg1 => 'one'
arg2 => 'two'

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