2

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=foovs. --base foo)。如果 GetoptLong 可以为我删除它们会方便得多。有没有办法做到这一点?

4

1 回答 1

4

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

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

很糟糕的形式。:(

于 2011-05-26T01:52:46.210 回答