1

ハッシュのハッシュを使用して、コードに設定を保存しました。@profile ハッシュのクラスのすべてのインスタンスで同じクラス変数のようなものを使用できるかどうか疑問に思います。したがって、以下の両方のプロファイルには、両方に等しい一般プロファイル変数があります。hashを使用するソリューションが必要です。

@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'
   }
} 
4

2 に答える 2

4

ハッシュには、キーが見つからないときに呼び出される特別なプロシージャがあることをご存知ですか?

これはここで非常にうまく使用できます。

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".

は Ruby 1.8.7のHash.default_proc=新機能なので、使用する必要があります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'
  }
}
于 2010-01-27T14:36:33.050 に答える
2

1 つの方法は、次のように共通ビットに定数を使用することです。

#!/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"}}}
于 2010-01-27T03:40:51.193 に答える