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
假设 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