ruby – 如何在不需要Thor CLI应用程序的情况下使用Thor操作?
发布时间:2020-12-17 03:55:15 所属栏目:百科 来源:网络整理
导读:Thor :: Actions( http://textmate.rubyforge.org/thor/Thor/Actions.html)有一些很棒的帮助方法我想访问但是如果不使用Thor CLI应用程序我似乎无法使用它们. 我试过简单地说: require "rubygems"require "thor"Thor::Actions.create_file "foo.txt","conte
Thor :: Actions(
http://textmate.rubyforge.org/thor/Thor/Actions.html)有一些很棒的帮助方法我想访问但是如果不使用Thor CLI应用程序我似乎无法使用它们.
我试过简单地说: require "rubygems" require "thor" Thor::Actions.create_file "foo.txt","contents" 哪个投掷: run.rb:4:在’< main>‘中:未定义方法’create_file’用于Thor :: Actions:Module(NoMethodError) 我意识到我可能会遗漏一些非常简单的东西.谢谢. 解决方法
Thor打算让你的类继承Thor类.然后Thor类包含并扩展模块,允许它们的方法成为类方法.如果您查看源代码,例如Actions.rb,您将看到我的意思:
# thor/lib/thor/actions.rb class Thor module Actions # this is the interesting part and answers your question def self.included(base) #:nodoc: base.extend ClassMethods end module ClassMethods 这是一个常见的Ruby习语,它使用mixin在其包含器上定义类方法(而不是实例方法). 举个例子, [2] pry(main)> class Klass [2] pry(main)* module Mod [2] pry(main)* def self.included(base) [2] pry(main)* base.extend ClassMethods [2] pry(main)* end [2] pry(main)* module ClassMethods [2] pry(main)* def act_as_class_method [2] pry(main)* puts "Im a class method now!!!" [2] pry(main)* end [2] pry(main)* end [2] pry(main)* end [2] pry(main)* end => nil 现在打电话 Klass::Mod.act_as_class_method 导致你遇到同样的错误 NoMethodError: undefined method `act_as_class_method' for Klass::Mod:Module from (pry):26:in `__pry__' 但是如果你继承Klass并包含Klass :: Mod,那么包含的回调会扩展ClassMethod模块,让你使用ClassMethods中定义的方法作为类方法 [4] pry(main)> class Example < Klass [4] pry(main)* include Klass::Mod [4] pry(main)* self.act_as_class_method [4] pry(main)* end => Im a class method now!!! => nil 这花了我一段时间才弄清楚,所以不要感觉不好,不要,它不是那么简单或明显. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |