只用于核心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脚本编写。