args
的含义是什么,如果存在差异,它与ARGV
之间的区别是什么?
def puts_two(*args)
arg1, arg2 = args
puts "arg1: #{arg1}, arg2: #{arg2}"
end
答案 0 :(得分:2)
ARGV是Ruby中的一个特殊变量。它包含在命令行上传递给脚本的参数。例如,如果您在名为test.rb的文件中编写以下代码:
ARGV.each do |a|
puts a
end
并像这样称呼它
c:\> ruby test.rb one two
将显示
one
two
在您发布的代码中,*args
仅表示该方法在名为args
的数组中接受可变数量的参数。它可以被称为你想要的任何东西(当然遵循Ruby命名规则)。
因此,在这种情况下,args
与ARGV
完全无关。
答案 1 :(得分:2)
这在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脚本的参数。