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

N.N*_*.N. 11 ruby thor

使用Thor,可以使用method_option设置特定任务的选项.要为类中的所有任务设置选项,可以使用class_option.但是,如果一个人想要一个班级的某些任务,而不是全部,分享选项呢?

在以下task1task2共享选项中,但它们不共享所有选项,并且它们不共享选项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)
Run Code Online (Sandbox Code Playgroud)

与说明的问题method_option :type, :type => :string, :required => true, :default => 'foo'两种task1,并task2是它违反了DRY原则.是否有一种惯用的处理方式?

N.N*_*.N. 14

method_optionthor.rb中定义,它根据文档采用以下参数:

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

知道了这一点,你可以将参数存储method_option在一个数组,展开阵列为单独的参数作为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)
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是惯用的,我不认为它是那么优雅.不过,这比违反DRY原则更好.