【问题标题】:What's the point of ARGV in Ruby?Ruby 中的 ARGV 有什么意义?
【发布时间】: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​​ 脚本,甚至没有意识到这一点。

标签: ruby stdin argv


【解决方案1】:

ARGV 在 Ruby 中的意义何在?

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

什么时候运行你需要做的文件:ruby ex1.rb 并输入你需要输入ruby ex1.rb blah blah blah 的第一个、第二个和第三个变量。

这是准确的一点,能够在运行文件时指定参数,例如:

ruby ex1.rb -a -b 3

这对所有运行程序的人有什么好处?

任何其他命令行程序都能这样做的好处是:用户可以预先指定他们想要的东西,而且它比交互式 CLI 更容易编写脚本。

他们无论如何都做不到,因为我认为它是一个可执行文件。

是的,他们可以。您刚刚给出了一个示例,说明用户将如何以这种方式运行您的程序。它是否可执行并不会改变任何东西。

【讨论】:

  • 我正在解决同样的问题,最初有些困惑,但后来能够解决。您在此处的 ARGV 回答有助于确认我的理解。我唯一的问题是 user = "ARGV.first" 中的 ".first" 是什么?
  • @Padawan ARGV 是一个包含所有参数的数组(正如我的回答中的链接文档中所指出的那样),所以 ARGV.first 得到第一个参数。只是普通的旧Array#first 在这里使用。
【解决方案2】:

ARGV 有着悠久的传统,来自 UNIX/POSIX 世界,其中大多数 C 程序必须包含以下内容:

int main(int argc, char **argv)
{
   return(0);
}

argc 表示提供的参数数量,argv 是一个低级指针,指向可能的多个字符串指针中的第一个。 argv 这个名字以各种形式流传至今。

命令行参数在开发人员中非常流行,尽管它们通常不像您想象的那样使用。未命名的参数更难处理。这就是为什么存在像 optparse 这样的东西来帮助处理它们的原因。

这是来自the OptionParser documentation 的示例:

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
    options[:verbose] = v
  end
end.parse!

p options
p ARGV

这允许您定义更多可用的命令行参数,然后使用它们。对于您的示例,我希望它可以像这样工作:

test_script --live "New York" --computer "Lenovo" --like

这使得参数是什么很明显,因为它们被命名了。

【讨论】:

  • 了解历史非常有用,可以很好地将其与变量名本身的可能来源联系起来
【解决方案3】:

考虑一些 Ruby 命令行实用程序,例如 railsrakegembundle。虽然这些都不是最终用户应用程序(如 Web 应用程序或 GUI 应用程序),但它们仍然是用户与之交互的用 Ruby 编写的程序。他们都接受论点:

$ rails new my_app
$ rake tests
$ gem install rails --no-rdoc --no-ri
$ bundle update

可以使用ARGV 来实现这些接受参数的命令行程序。虽然我们经常为此目的使用 OptionParser standard library 或其他一些工具,但 ARGV 是构建这些工具的底层集合。

因此,如果您曾经运行过 gemrailsrakebundle,或任何用 Ruby 编写的命令行开发工具,那么您将从 ARGV 中受益!

【讨论】:

    【解决方案4】:

    ARGV 的意义在于,它使脚本能够在没有人工输入的情况下运行,并且还允许输入可能因迭代而异的情况。

    例如,您可能正在运行三个不同的脚本来获取三个值。然后可以将这些值传递到此脚本中,并且可以使用ARGV 来获取这些选项的值。

    【讨论】:

      【解决方案5】:

      我曾经运行一个脚本,要求我输入电子邮件和密码。它用于登录 100 个帐户之一。像大多数 Ruby 脚本一样,我会从命令行运行它。这必须类似于一个“可执行文件”,尤其是不是一个带有可单击图标的文件。

      我会运行该程序,它会询问我电子邮件和密码,然后使用 Watir 登录。

      puts "Email of Account"
      account_email = gets.chomp
      
      puts "Enter Password"
      password = gets.chomp
      
      # code that logs me in
      

      但是,我发现通过 ARGV 获取这些值对我来说要快得多。

      account_email, password = ARGV
      # code that logs me in
      

      然后我可以输入

      $ ruby my_script.rb my.email@emailplace.com mypassword
      

      然后按回车键。我也可以按控制台中的向上箭头一次又一次地运行它,或者使用不同名称和密码的最新版本来快速测试我的脚本。

      更进一步,我制作了一个 shell 脚本,可以运行此脚本、args 以及所有这些脚本的多种组合

      ruby my_script.rb oneofmy@emails.com mypassword
      ruby my_script.rb another@emails.com otherpassword
      

      最后,有时我需要在每次运行脚本时设置几十个设置,然后多次运行该脚本。所以我也可以很容易地从命令行将几十个变量插入到脚本中

      ruby my_script.rb option1 option2 option3 option4
      

      我对使用 ARGV 非常陌生,希望学习更好的使用方法,但我发现这是一个非常有用的功能。

      【讨论】:

        猜你喜欢
        • 2013-05-15
        • 2011-03-21
        • 1970-01-01
        • 2022-06-20
        • 2011-03-02
        • 1970-01-01
        • 2013-09-08
        相关资源
        最近更新 更多