哪个更正确? 我知道他们两个都“有效”,但是在哪里放置配置块的约定是什么?
此:
class Something
Library1.config do |config|
#call configuration methods
end
Library2.config do |config|
#call configuration methods
end
def initialize
#build the object
end
end
还是这个?
class Something
def initialize
Library1.config do |config|
#call configuration methods
end
Library2.config do |config|
#call configuration methods
end
#build the object
end
end
答案 0 :(得分:0)
没有一个正确的答案。你只需知道每种情况下你想要什么,因为他们做了不同的事情。
两者都是你可能想要的东西,但我可能会 。
为什么呢?因为您正在修改许多类可能依赖的模块的全局状态,所以可能只想配置一次。相反,我会将配置放入一个专门的配置文件,在初始化时加载。这通常在例如rails(请参阅:rails项目的config/
目录中的所有内容。)
我构建了一个示例,说明了不同的行为,以及在更改模块的全局配置时,rouge类(Spoiler
)如何使每个人感到困惑。在此示例中,Spoiler
更改配置两次,明显影响NaiveUser
。
module Configurable
def self.configuration
@configuration ||= { number: 1 }
end
def self.config
yield(configuration)
end
end
class NaiveUser
def configurable_number
Configurable.configuration[:number]
end
end
puts NaiveUser.new.configurable_number
class Spoiler
Configurable.config do |c|
c[:number] = "first spoil"
end
def initialize
Configurable.config do |c|
c[:number] = "spoiled again"
end
end
end
puts NaiveUser.new.configurable_number
Spoiler.new
puts NaiveUser.new.configurable_number
该程序的输出是
1
first spoil
spoiled again
这个例子可以是例如扩展到一个示例,其中有状态NaiveUser
错误地混合来自两个不同配置的结果(错误的)假设配置将保持不变。