只用于核心arg解析的ruby语法糖
用于计算非开关参数的语法糖只用于核心arg解析的ruby语法糖,ruby,arguments,Ruby,Arguments,用于计算非开关参数的语法糖 argn = 0 ARGV.each do |arg| mission = Mission_DB.new unless mission if(arg.match(/^\-.*=/)) then fsav = arg.split('=')[1] if arg.match(/\-save=/) skip = arg.split('=')[1].split(',') if arg.
argn = 0
ARGV.each do |arg|
mission = Mission_DB.new unless mission
if(arg.match(/^\-.*=/)) then
fsav = arg.split('=')[1] if arg.match(/\-save=/)
skip = arg.split('=')[1].split(',') if arg.match(/\-skip=/)
mission.mission = arg.split('=')[1].downcase if arg.match(/\-mission=/)
else
argn += 1
mission.parseP1SCLRV(arg) if argn == 1
template = arg if argn == 2
mission.parseP1SCLRVPLV(arg) if argn == 3
mission.parseDbUserLimits(arg) if argn == 4
end
end
我试图找到一种可重用的、干净的、仅核心的arg解析语法,这种语法直观(无需注释即可阅读)。这还不错。。。但这还不够好
- 我讨厌阿金的废话
- 我讨厌if/-.*=/后跟每个单独的开关
- 每一个带有索引的_都不能真正实现我想要的功能,因为开关可以嵌入非交换参数中的任何位置
fsav = nil
skip = []
template = p1sclrv = p1sclrvplv = dbuserlimits = nil
ARGV.each do |arg|
case arg
when /\-save=/ then fsav = arg.split('=')[1]
when /\-skip=/ then skip = arg.split('=')[1].split(',')
when /\-mission=/ then mission.mission = arg.split('=')[1].downcase
else
unless(p1sclrv) then p1sclrv = arg; next; end
unless(template) then template = arg; next; end
unless(p1sclrvplv) then p1sclrvplv = arg; next; end
unless(dbuserlimits) then dbuserlimits = arg; next; end
end
end
编辑:变得更好。我自己的迭代:
fsav = nil
skip = []
template = p1sclrv = p1sclrvplv = dbuserlimits = nil
ARGV.each do |arg|
case arg
when /\-save=/ then fsav = arg.split('=')[1]
when /\-skip=/ then skip = arg.split('=')[1].split(',')
when /\-mission=/ then mission.mission = arg.split('=')[1].downcase
else
unless(p1sclrv) then p1sclrv = arg; next; end
unless(template) then template = arg; next; end
unless(p1sclrvplv) then p1sclrvplv = arg; next; end
unless(dbuserlimits) then dbuserlimits = arg; next; end
end
end
编辑:越来越好。您考虑过使用吗?它附带Ruby标准库
下面是一个类,它使用optparse对示例中的参数进行选项解析。它处理错误,在给出“-h”或“-help”时打印其用法,并将解析的参数封装到一个可以传递的好类中:
require 'optparse'
class Arguments
POSITIONAL_ARGS = %w(p1sclrv template p1sclrvplv db_user_limits)
attr_reader :mission
attr_reader :save_path
attr_reader :what_to_skip
attr_reader *POSITIONAL_ARGS
def initialize(argv)
option_parser.parse!(argv)
POSITIONAL_ARGS.each do |positional_arg|
value = argv.shift
instance_variable_set("@#{positional_arg}", value)
raise OptionParser::MissingArgument, positional_arg.to_s unless value
end
raise OptionParser::NeedlessArgument, argv.first unless argv.empty?
rescue OptionParser::ParseError => e
puts e
puts option_parser
exit(1)
end
private
def option_parser
OptionParser.new do |op|
op.banner += ' ' + POSITIONAL_ARGS.join(' ')
op.on('--save=PATH', 'Save to PATH') do |value|
@save_path = value
end
op.on('--skip=WHAT', 'Skip WHAT') do |value|
@what_to_skip = value
end
op.on('--mission=NAME', 'Do mission NAME') do |value|
@mission = value
end
end
end
end
在实际使用中,将ARGV传递给它:
args = Arguments.new(ARGV)
下面是一个传递虚构ARGV并打印解析参数的示例:
args = Arguments.new(%w(--skip=FOO alpha bravo charley delta))
p args.p1sclrv # => "alpha"
p args.template # => "bravo"
p args.p1sclrvplv # => "charley"
p args.db_user_limits # => "delta"
p args.mission # => nil
p args.save_path # => nil
p args.what_to_skip # => "FOO"
以下是帮助的内容:
Arguments.new(%w(--help))
# => Usage: foo [options] p1sclrv template p1sclrvplv db_user_limits
# => --save=PATH Save to PATH
# => --skip=WHAT Skip WHAT
# => --mission=NAME Do mission NAME
你考虑过使用吗?它附带Ruby标准库
下面是一个类,它使用optparse对示例中的参数进行选项解析。它处理错误,在给出“-h”或“-help”时打印其用法,并将解析的参数封装到一个可以传递的好类中:
require 'optparse'
class Arguments
POSITIONAL_ARGS = %w(p1sclrv template p1sclrvplv db_user_limits)
attr_reader :mission
attr_reader :save_path
attr_reader :what_to_skip
attr_reader *POSITIONAL_ARGS
def initialize(argv)
option_parser.parse!(argv)
POSITIONAL_ARGS.each do |positional_arg|
value = argv.shift
instance_variable_set("@#{positional_arg}", value)
raise OptionParser::MissingArgument, positional_arg.to_s unless value
end
raise OptionParser::NeedlessArgument, argv.first unless argv.empty?
rescue OptionParser::ParseError => e
puts e
puts option_parser
exit(1)
end
private
def option_parser
OptionParser.new do |op|
op.banner += ' ' + POSITIONAL_ARGS.join(' ')
op.on('--save=PATH', 'Save to PATH') do |value|
@save_path = value
end
op.on('--skip=WHAT', 'Skip WHAT') do |value|
@what_to_skip = value
end
op.on('--mission=NAME', 'Do mission NAME') do |value|
@mission = value
end
end
end
end
在实际使用中,将ARGV传递给它:
args = Arguments.new(ARGV)
下面是一个传递虚构ARGV并打印解析参数的示例:
args = Arguments.new(%w(--skip=FOO alpha bravo charley delta))
p args.p1sclrv # => "alpha"
p args.template # => "bravo"
p args.p1sclrvplv # => "charley"
p args.db_user_limits # => "delta"
p args.mission # => nil
p args.save_path # => nil
p args.what_to_skip # => "FOO"
以下是帮助的内容:
Arguments.new(%w(--help))
# => Usage: foo [options] p1sclrv template p1sclrvplv db_user_limits
# => --save=PATH Save to PATH
# => --skip=WHAT Skip WHAT
# => --mission=NAME Do mission NAME
感谢您对optparse的介绍。。我以前没看过。我的挑战是,脚本最终将使用非编码类型,因此我需要尽可能保持语法上的简单。操作员不喜欢运行他们不理解的代码,但他们也不经常关心学习编码。@Reed,有了这个约束,消除了所有开关参数,只使用位置参数。然后就是
foo=ARGV.shift
,bar=ARGV.shift
,等等。您编写的是代码,就像使用optpass一样。一个“非编码者”对这两者都没有机会。因此,如果您的“非编码人员”熟悉shell脚本,那么脚本应该用shell脚本编写。感谢对optpass的介绍。。我以前没看过。我的挑战是,脚本最终将使用非编码类型,因此我需要尽可能保持语法上的简单。操作员不喜欢运行他们不理解的代码,但他们也不经常关心学习编码。@Reed,有了这个约束,消除了所有开关参数,只使用位置参数。然后就是foo=ARGV.shift
,bar=ARGV.shift
,等等。您编写的是代码,就像使用optpass一样。一个“非编码者”对这两者都没有机会。因此,如果您的“非编码人员”熟悉shell脚本,那么脚本应该用shell脚本编写。