Thor - 如何使用 lambda 函数在 method_options 上表达默认值

Thor - how to use lambda functions for expressing default values on method_options

假设 method_option 的形式为:

method_option :host_domain,       aliases: '-h', default: 'some value'

能否使用非平凡的 lambda 函数代替 'some value' 以在 运行 时导出默认值。

一些微不足道的东西,比如:

method_option :host_domain,       aliases: '-h', default: -> { 'some value'.upcase}.call

工作正常。

但是,类似的东西:

method_option :host_domain,       aliases: '-h', default: -> { Model.method}.call

不是,因为它找不到模型实例(在 app/lib/models 中定义并且之前已经加载)。似乎在 module_option 语句处,Thor class 尚未初始化。我想因此挂了一个 tale.hir

此外,在 method_option 语句之后的 def new 方法中,我可以毫无问题地引用模型。我还注意到 Thor class 已经在进入新方法之前进行了初始化(如您所料)。

如果能提供有关如何浏览 Thor 层次结构以解决问题的任何指导,我们将不胜感激。

经过进一步探索,我发现延迟执行 lambda 函数可以解决问题。

即在方法new中调用lambda函数如下:

变化:

method_option :host_domain,       type: :string, default: -> {Model.method}.call

至:

method_option :host_domain,       type: :string, default: -> {Model.method}

并在:

def new(url)
  ...
  ...
  options[:host_domain] = options[:host_domain].call