【问题标题】:Ruby GetoptLong modifies ARGV?Ruby GetoptLong 修改 ARGV?
【发布时间】:2011-05-26 01:26:52
【问题描述】:

Ruby 的GetoptLong 的文档给我的印象是它会从 ARGV 中删除已解析的选项。这是有问题的段落:

例如,如果 -a 不需要参数并且 -b 可选地接受参数, 解析 '-a 一 -b 二三' 将导致 ('-a','') 和 ('-b', 'two') 被处理为选项/参数对,并且 'one','three' 被处理留在 ARGV。

但是,情况似乎并非如此。这是我的程序:

#!/usr/bin/env ruby

require "getoptlong"
opts = GetoptLong.new(
  ["--start", "-s", GetoptLong::REQUIRED_ARGUMENT],
  ["--base",  "-b", GetoptLong::REQUIRED_ARGUMENT]
)

puts ARGV

这是输出:

$ number-photos --start 2 --base foo *
--start
2
--base
foo
aac-to-mp3
backup-wp-uploads
exiv-webcam-imgs
get-updates
music-to-lily
number-photos
ogg-to-mp3
rename-music
restore-uploads
resymlink
sprints
sync-jt
sync-st
timestamp
unix-names

(我确实检查过我使用的是 ruby​​ 1.9.2。)

我可以手动删除选项,但这会有点令人头疼,因为根据您传递它们的方式,每个选项都可能占用数组中的一个或两个插槽(--base=foo--base foo )。如果 GetoptLong 可以为我删除它们会方便得多。有没有办法做到这一点?

【问题讨论】:

    标签: ruby getopt getopt-long


    【解决方案1】:

    我想我理解这意味着该项目没有放在 getopt 组中。它保留在 ARGV 中,就像其他所有内容一样...为什么要修改 ARGV?

    更新 eww。在对文档中的示例进行了一些实验后,它不会从 ARGV 中删除项目,直到 opts.each 运行...看来删除是在 opts 中访问项目的副作用。

    非常糟糕的形式。 :(

    【讨论】:

    • 是的,成功了!我同意,这很恶心。哦,好吧:我想一个糟糕的解决方案总比没有好。非常感谢您找到它!仅供参考,我认为它可能会修改 ARGV,因为 Perl Getopt::Long 类就是这样做的。只是一个疯狂的猜测。
    • 这可能是由于底层的 C 库实现,但它本质上非常不红。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多