Ruby 是否存在与自定义';类变量';?(红宝石)
我使用散列来存储代码中的设置。我想知道是否可以为@profile散列的类的所有实例提供类似于类变量的内容。因此,下面的两个配置文件的常规配置文件变量都等于这两个配置文件。我希望解决方案使用hashRuby 是否存在与自定义';类变量';?(红宝石),ruby,scope,class-variables,Ruby,Scope,Class Variables,我使用散列来存储代码中的设置。我想知道是否可以为@profile散列的类的所有实例提供类似于类变量的内容。因此,下面的两个配置文件的常规配置文件变量都等于这两个配置文件。我希望解决方案使用hash @profile = { "vB4Discussions" => { #profile name "urls" => ["vB4 General Discussions"], "process?" => false, "type" =>
@profile = {
"vB4Discussions" => { #profile name
"urls" => ["vB4 General Discussions"],
"process?" => false,
"type" => 'Discussion'
},
"vB4Design".downcase => { #profile name
"urls" => ["vB4 Design and Graphics Discussions"],
"process?" => false,
"type" => 'Design'
}
}
一种方法是对公共位使用常量,如下所示:
#!/usr/bin/ruby1.8
require 'pp'
COMMON_PROFILE = {
"urls" => ["vB4 General Discussions"],
"process?" => false,
"type" => 'Discussion'
}
@profile = {
"vB4Discussions" => COMMON_PROFILE,
"vB4Design".downcase => COMMON_PROFILE,
}
pp @profile
# => {"vB4Discussions"=>
# => {"vB4Discussions"=>
# => {"urls"=>["vB4 General Discussions"],
# => "process?"=>false,
# => "type"=>"Discussion"}},
# => "vb4design"=>
# => {"vB4Discussions"=>
# => {"urls"=>["vB4 General Discussions"],
# => "process?"=>false,
# => "type"=>"Discussion"}}}
一种方法是对公共位使用常量,如下所示:
#!/usr/bin/ruby1.8
require 'pp'
COMMON_PROFILE = {
"urls" => ["vB4 General Discussions"],
"process?" => false,
"type" => 'Discussion'
}
@profile = {
"vB4Discussions" => COMMON_PROFILE,
"vB4Design".downcase => COMMON_PROFILE,
}
pp @profile
# => {"vB4Discussions"=>
# => {"vB4Discussions"=>
# => {"urls"=>["vB4 General Discussions"],
# => "process?"=>false,
# => "type"=>"Discussion"}},
# => "vb4design"=>
# => {"vB4Discussions"=>
# => {"urls"=>["vB4 General Discussions"],
# => "process?"=>false,
# => "type"=>"Discussion"}}}
您知道当找不到密钥时,哈希可以调用一个特殊的过程吗 这可以很好地用在这里
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\u proc=
对于Ruby 1.8.7来说是新的,因此您需要要求“backport”
来使用它。如果您不想这样做,您可以在创建Hash时指定默认过程,如下所示:
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'
}
}
您知道当找不到密钥时,哈希可以调用一个特殊的过程吗 这可以很好地用在这里
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\u proc=
对于Ruby 1.8.7来说是新的,因此您需要要求“backport”
来使用它。如果您不想这样做,您可以在创建Hash时指定默认过程,如下所示:
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'
}
}
我明白了,这花了我一些时间,但我明白了:-)是的,这是一种可能的方法。让我们看看其他人是否能想到其他方法…谢谢你。请记住,只有在你不会动态更改配置的情况下,此解决方案才是好的。要找出原因,请创建此哈希,修改其中一个配置:@profile['VB4Discussions'][“类型”]='chit chat',然后打印散列。当你理解了你看到的内容后,你就会知道一些重要的事情。你是说修改公共位会影响所有配置文件吗?在我看来,我会使用你的想法,但会以稍微修改的方式。我会向所有配置文件添加新的公共配置文件散列。是的,这就是我的意思。你是远远超过我。我希望我是:-))))))))))我喜欢你的解决方案,它已经实现并运行。虽然有点不同。我也喜欢下面的解决方案。我明白了,这花了我一些时间,但我明白:-)是的,这是一种可能的方法。让我们看看其他人是否能想到其他方法…谢谢你。记住,只有在你不改变配置的情况下,这个解决方案才是好的要找出原因,请创建此哈希,修改其中一个配置:@profile['VB4Discussions']['type']='chit chat',然后打印散列。当你理解了你看到的内容后,你就会知道一些重要的事情。你是说修改公共位会影响所有配置文件吗?在我看来,我会使用你的想法,但会以稍微修改的方式。我会向所有配置文件添加新的公共配置文件散列。是的,这就是我的意思。你是远远超过我。我希望我是:-‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘)我喜欢你的解决方案,它已经实施并正在运行。不过有点不同。我也喜欢下面的解决方案。@Marc Andre Lafortune:非常有趣的概念。肯定回答了我的问题。遗憾,我不能使用“接受”两次。@Marc Andre Lafortune:非常有趣的概念。肯定回答了我的问题。遗憾我不能用“接受”两次。