optionparser传递一个数组到ruby文件

j8yoct9x  于 2023-04-29  发布在  Ruby
关注(0)|答案(2)|浏览(92)

我在向ruby文件传递参数时遇到了麻烦。IE

OptionParser.new do |opts|
  opts.banner = 'Usage: mp3split.rb [options]'

  opts.on('-f', '--filename fName1,fName2,fName3', Array, 'absolute or relative pathes to file') { |f| options[:filenames] = f }
end.parse!

这种方法需要我编写以下命令:

ruby mp3split.rb --filename fursov_13.mp3,fursov_14.mp3,fursov_14_2.mp3,fursov_15.mp3,fursov_16.mp3,fursov_17.mp3

但是我想通过这个得到array:

ruby mp3split.rb --filename fursov_13.mp3 fursov_14.mp3 fursov_14_2.mp3 fursov_15.mp3 fursov_16.mp3 fursov_17.mp3

如何实现此功能?我找不到任何有用的文件。

bvuwiixz

bvuwiixz1#

OptionParser你不能。但是,有一个解决方法,当只有一个列表需要以这种方式处理,并且不会向脚本传递其他参数时。OptionParser在处理输入之前按空格 * 拆分输入。解析后,未键控的参数保留在ARGV全局常量中。假设上面描述的所有内容都满足,我们开始:

OptionParser.new do |opts|
  options[:filenames] = []
  opts.banner = 'Usage: mp3split.rb [options]'        
  opts.on('-f', '--filename fName1 fName2 fName3', Array, 
          'absolute or relative pathes to file') do |f|
    options[:filenames] |= [*f]
  end
end.parse!

options[:filenames] |= ARGV

我显然修复了代码中的另一个小故障:options[:filenames]应该在每次-f交换机出现时 * 附加 * 而不是 * 覆盖 *,OptionParser支持script -f f1 -f f2 -f f3

vxf3dgd4

vxf3dgd42#

我很震惊地发现OptionParter不能做这么简单的事情,所以我切换到Thor,例如:

require 'thor'

class EmqxCLI < Thor
  desc 'add_user USER_ID PASSWORD [IS_SUPERUSER]', 'Add a user (optional: set true/false for is_superuser)'
  def add_user(user_id, password, is_superuser = false)
    emqx = EmqxApi.new
    emqx.add_user(user_id, password, is_superuser)
  end

  desc 'remove_user USER_ID', 'Remove a user'
  def remove_user(user_id)
    emqx = EmqxApi.new
    emqx.remove_user(user_id)
  end

  desc 'list_users', 'List users'
  def list_users
    emqx = EmqxApi.new
    emqx.list_users
  end
end

EmqxCLI.start(ARGV)

我现在可以运行:

$ ruby emqx.rb add_user user1 pass1

它在没有参数的情况下运行时也会生成一个可爱的输出:

# ruby emqx.rb
Commands:
  emqx.rb add_user USER_ID PASSWORD [IS_SUPERUSER]  # Add a user (optional: set true/false for is_superuser)
  emqx.rb help [COMMAND]                            # Describe available commands or one specific command
  emqx.rb list_users                                # List users
  emqx.rb remove_user USER_ID                       # Remove a user

相关问题