2016-07-28 47 views
0

假设形式的method_option:托尔 - 如何使用lambda函数对method_options表达默认值

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

能一个不平凡的lambda函数到位“一些价值”导出默认使用运行时的价值。

一些小事,如:

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

工作正常。

然而,这样的:

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

不会因为它不能找到模型实例(这是在app/lib中/模型定义&已事先加载)。它也似乎在module_option语句中,Thor类尚未初始化。我想从此挂起一个故事。

此外,在方法def new中,遵循method_option语句,我可以引用Model与out问题。我还注意到,在新方法进入之前,Thor类已经初始化(如您所期望的那样)。

希望了解如何浏览Thor层次结构以解决问题的任何指导。

回答

0

在进一步的研究中,我发现延迟执行lambda函数解决了这个问题。

也就是说,在该方法,调用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