Знаете ли вы, что для хэшей может быть вызван специальный процесс, когда ключ не найден?
Это можно использовать здесь очень хорошо.
require "backports" # Needed in Ruby 1.8.6
SETTINGS = {
"default" => {
"urls" => [],
"process?" => false,
"type" => 'Discussion'
},
"vB4Discussions" => {
"urls" => ["vB4 General Discussions"],
},
"vB4Design".downcase => {
"urls" => ["vB4 Design and Graphics Discussions"],
"type" => 'Design'
}
}
# Use defaults
SETTINGS["vb4design"].default_proc = lambda{|h, k| SETTINGS["default"][k]}
SETTINGS["vB4Discussions"].default_proc = lambda{|h, k| SETTINGS["default"][k]}
# Now the defaults are used if needed:
SETTINGS["vB4Discussions"]["type"] # ==> 'Discussion'
SETTINGS["vB4Discussions"]["process?"] # ==> false
# Defaults can be edited later:
SETTINGS["default"]["process?"] = true
SETTINGS["vB4Discussions"]["process?"] # ==> true
SETTINGS["vb4design"]["process?"] # ==> true
# Specific value can be changed too
SETTINGS["vb4design"]["process?"] = false # ==> true
SETTINGS["vB4Discussions"]["process?"] # ==> true
Примечание: Если у вас нет веской причины использовать строки, вы должны использовать символы для своих ключей (т.е. :vB4Discussions
вместо "vB4Discussions"
.
Hash.default_proc=
является новым для Ruby 1.8.7, поэтому вам необходимо require "backports"
, чтобы использовать его. Если вы не хотите этого, вместо этого вы можете указать proc по умолчанию при создании хэшей следующим образом:
DEFAULTS = {
"urls" => [],
"process?" => false,
"type" => 'Discussion'
}
SETTINGS = {
"default" => DEFAULTS,
"vB4Discussions" => Hash.new{|h, k| DEFAULTS[k]}.merge!{
"urls" => ["vB4 General Discussions"],
},
"vB4Design".downcase => Hash.new{|h, k| DEFAULTS[k]}.merge!{
"urls" => ["vB4 Design and Graphics Discussions"],
"type" => 'Design'
}
}