假设形式为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
不会,因为它无法找到Model实例(在app / lib / models&中定义,之前已经加载过)。似乎在module_option语句中,Thor类尚未初始化。我想因此挂起了一个故事。
此外,在方法def new中,在method_option语句之后,我可以引用模型而没有问题。我还注意到Thor类在进入新方法之前已经初始化(正如您所期望的那样)。
非常感谢有关如何导航Thor层次结构以解决问题的任何指导。
答案 0 :(得分:0)
在进一步探索中,我发现延迟执行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