【发布时间】:2015-11-12 08:32:34
【问题描述】:
Ruby 中 ARGV 的意义何在?
first, second, third = ARGV
puts "The script is called: #{$0}"
puts "Your first variable is: #{first}"
puts "Your second variable is: #{second}"
puts "Your third variable is: #{third}"
什么时候运行我需要做的文件:
ruby ex1.rb
并输入我需要输入的第一、第二和第三个变量
ruby ex1.rb blah blah blah
这对所有运行程序的人有什么好处?他们无论如何都做不到,因为我认为它是一个可执行文件:
user = ARGV.first
prompt = '> '
puts "Hi #{user}, I'm the #{$0} script."
puts "I'd like to ask you a few questions."
puts "Do you like me #{user}?"
print prompt
likes = STDIN.gets.chomp()
puts "Where do you live #{user}?"
print prompt
lives = STDIN.gets.chomp()
puts "What kind of computer do you have?"
print prompt
computer = STDIN.gets.chomp()
puts <<MESSAGE
Alright, so you said #{likes} about liking me.
You live in #{lives}. Not sure where that is.
And you have a #{computer} computer. Nice.
MESSAGE
谁能给我解释一下?
【问题讨论】:
-
“他们无论如何都做不到,因为我认为它是一个可执行文件”表明这种想法存在缺陷。如果它是可执行的,它有什么区别?这只是在操作系统中设置的一点,并不影响脚本是否可以接受参数。也许您的意思是脚本将启动并与 GUI 一起使用,但即便如此,脚本也有可能在其启动过程中接收参数......这让我认为整个问题都是错误的。跨度>
-
在给出的示例中,所有输入都在运行期间收集,以响应用户输入。 ARGV 将在运行开始时收集该数据,无需用户输入。
-
考虑上面代码的每个“块”都相当昂贵的情况,例如10秒运行。你宁愿键入,等待 10 秒,键入,等待 10 秒等... - 或 - 键入,然后等待 30 秒?有一个例子说明了为什么在初始执行时提供参数而不是在需要时提供参数是有用的。
-
也可以在
ex1.rb文件的顶部使用#!/usr/bin/env ruby之类的shebang 行来运行ruby 脚本(以及许多其他东西)。如果您是chmod a+x ex1.rb,则可以不使用ruby前缀运行它:./ex1.rb。事实上,.rb扩展甚至不是必需的,这意味着您可能已经在使用带有命令行参数的 ruby 脚本,甚至没有意识到这一点。