Ruby模块常量设置和读取
我正在开发一个包含标准方法以及CLI(Thor)和API(Sinatra)的模块。我创建了一个子模块,其中包含一个继承Sinatra::Base的类:Ruby模块常量设置和读取,ruby,sinatra,Ruby,Sinatra,我正在开发一个包含标准方法以及CLI(Thor)和API(Sinatra)的模块。我创建了一个子模块,其中包含一个继承Sinatra::Base的类: module Monteverde module Activity def self.version "1.0.1" end class API < Sinatra::Base set :port, 22340 get "/version" do Montev
module Monteverde
module Activity
def self.version
"1.0.1"
end
class API < Sinatra::Base
set :port, 22340
get "/version" do
Monteverde::Activity.version
end
run! if defined? Monteverde::OPERATION
end
end
end
蒙特维德模块
模块活动
def自我版本
"1.0.1"
结束
类API...
class API < Sinatra::Base
register Sinatra::DefaultRoutes
set :port, 22340
get "/version" do
Monteverde::Activity.version
end
run!
end
$ ruby monteverde.rb aversion
$ == Sinatra (v2.0.0) has taken the stage on 22340 for development with backup from Puma
$ ...
。。。
类API
我的问题是,即使在调用模块之前设置了操作常量,也无法识别它
为什么手术没有被识别?我如何才能识别?
有没有其他更直观/有用的方法让Sinatra在我调用模块时不开火?在API类定义中,运行
代码>行将在您需要该文件时立即执行。如果引用该类,它将不会再次运行,正如您尝试使用defapi
方法的最后一行所做的那样
要解决此问题,您可以移动运行将>命令编码到方法中,并从Thor调用该方法:
class API < Sinatra::Base
# ... other stuff
def self.start
run! if defined? Monteverde::OPERATION
end
end
你可以推断运行
是一个类方法,因为它可以在类定义的范围内调用(而不是在实例方法中),所以我定义了一个类方法来调用它
不过,如果不定义def self.start
,而只调用run直接从Thor文件中选择代码>方法:
def api
Monteverde::Activity::API.run!
end
是否会定义更明确的monterverde.const_?“操作”
work?问题是,当Sinatra::Base继承API类时,无法识别常量。我需要找到一种在API类中包含外部变量/常量的方法。很好的答案!我从没想过这会像叫run这么简单!直接的。
def api
Monteverde.const_set("OPERATION", "started")
Monteverde::Activity::API.start
end
def api
Monteverde::Activity::API.run!
end