如何让两个雷神任务共享选项?

2024-03-25

有了托尔,人们就可以使用method_option https://github.com/wycats/thor/wiki/Method-Options设置特定任务的选项。要为班级中的所有任务设置选项,可以使用class_option。但是,如果一个人希望某个类的某些任务(而不是全部)共享选项,该怎么办?

在下面的task1 and task2分享期权,但他们不分享所有期权,并且不与他人分享任何期权task3.

require 'thor'

class Cli < Thor
  desc 'task1', 'Task 1'
  method_option :type, :type => :string, :required => true, :default => 'foo'
  def task1
  end

  desc 'task2', 'Task 2'
  method_option :type, :type => :string, :required => true, :default => 'foo'
  method_option :value, :type => :numeric
  def task2
  end

  desc 'task3', 'Task 3'
  method_option :verbose, :type => :boolean, :aliases => '-v'
  def task3
  end
end

Cli.start(ARGV)

陈述的问题method_option :type, :type => :string, :required => true, :default => 'foo'对彼此而言task1 and task2是它违反了干燥原则 http://en.wikipedia.org/wiki/Don%27t_repeat_yourself。有处理这个问题的惯用方法吗?


method_option定义于thor.rb https://github.com/wycats/thor/blob/1f91d12fce7aef74028e2423e991c6c34036d731/lib/thor.rb#L81-L114根据文档,它采用以下参数:

  • name<Symbol>::参数的名称。
  • options<Hash>::如下面所描述的。

知道这一点后,您可以将参数存储到method_option在数组中和将该数组扩展为单独的参数 http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_methods.html#UC as method_option叫做。

require 'thor'

class Cli < Thor
  shared_options = [:type, {:type => :string, :required => true, :default => 'foo'}]

  desc 'task1', 'Task 1'
  method_option *shared_options
  def task1
  end

  desc 'task2', 'Task 2'
  method_option *shared_options
  method_option :value, :type => :numeric
  def task2
  end

  desc 'task3', 'Task 3'
  method_option :verbose, :type => :boolean, :aliases => '-v'
  def task3
  end
end

Cli.start(ARGV)

我不知道这是否惯用,而且我认为它没有那么优雅。尽管如此,这还是比违反 DRY 原则要好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让两个雷神任务共享选项? 的相关文章

随机推荐