#!/usr/bin/env ruby
require 'optparse'
options = {}
OptionParser.new do |opts|
opts.on("--language LANGUAGE", ["Ruby", "JavaScript"]) do |language|
options[:language] = language
end
end.parse!
puts "Language: #{options[:language]}"
如果我使用./bin/example --language Ru
运行此命令,则会输出:
语言:Ruby
我想禁用此autocomplete/closest match
行为,并在未提供确切名称的情况下提高OptionParser的权限,但是从他们的文档中我看不到这样做的方法。
有什么想法吗?
答案 0 :(得分:1)
搜索设置在self.regexp
方法complete
似乎返回了所有不同的标志。
方法self.regexp
定义了使用的搜索查询
class OptionParser
module Completion
def self.regexp(key, icase)
Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'), icase)
end
end
end
正则表达式使用以下标志构建
\A
从字符串的开头进行搜索
\w*
搜索任何匹配的字符
candidate
使用&method(:each)
作为proc
传递的method object &
进行迭代。 method object
在Completion
类上被调用。
candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}
self.candidate
内的块iterates
def self.candidate(key, icase = false, pat = nil, &block)
pat ||= Completion.regexp(key, icase)
candidates = []
block.call do |k, *v|
// Search and add candidates
end
candidates
end
iterator
对each
条目执行以下检查。
我仍然对此检查没有100%的了解,负责查找标记。
block.call do |k, *v|
(if Regexp === k
kn = ""
k === key
else
kn = defined?(k.id2name) ? k.id2name : k
pat === kn
end) or next
v << k if v.empty?
candidates << [k, v, kn]
end
candidates