【发布时间】:2014-02-24 16:42:09
【问题描述】:
args是什么意思,如果有区别,它和ARGV有什么区别?
def puts_two(*args)
arg1, arg2 = args
puts "arg1: #{arg1}, arg2: #{arg2}"
end
【问题讨论】:
标签: ruby
args是什么意思,如果有区别,它和ARGV有什么区别?
def puts_two(*args)
arg1, arg2 = args
puts "arg1: #{arg1}, arg2: #{arg2}"
end
【问题讨论】:
标签: ruby
* 被称为 splat 运算符。在*args 这里* 创建一个数组,其中所有参数都发送到方法puts_two,并且args 作为局部变量保存对数组的引用。以更清晰的方式 - splat 运算符用于处理具有可变参数列表的方法(即排列你的参数)。
ARGV 包含传递给脚本的参数,每个元素一个。
例如:
$ ruby argf.rb -v glark.txt
在argf.rb文件中,你会得到如下:
ARGF.argv #=> ["-v", "glark.txt"]
【讨论】:
这在 Ruby 中被称为“splat 运算符”。有关不同用途,请参阅以下文章:
在方法定义中,它基本上只是将所有剩余参数收集到一个数组中(请注意,从 Ruby 2.0 开始,还可以使用 **kwargs 之类的东西收集关键字 args)。
【讨论】:
ARGV 是 Ruby 中的一个特殊变量。它包含在命令行上传递给脚本的参数。例如,如果您在名为 test.rb 的文件中编写以下代码:
ARGV.each do |a|
puts a
end
然后这样称呼它
c:\> ruby test.rb one two
会显示
one
two
在您发布的代码中,*args 只是表示该方法接受名为args 的数组中的可变数量的参数。它可以被称为任何你想要的(当然,遵循 Ruby 命名规则)。
所以在这种情况下,args 与 ARGV 完全无关。
【讨论】:
在这种情况下,*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 脚本的参数。
【讨论】: