есть ли хеш-эквивалент пользовательских «переменных класса»? (Рубин) - PullRequest
1 голос
/ 27 января 2010

Я использовал хэш хэшей, чтобы сохранить настройки в моем коде. Интересно, могу ли я иметь что-то вроде переменной класса, которая одинакова для всех экземпляров класса для моего хеша @profile. Таким образом, оба профиля ниже будут иметь общую переменную профиля, равную им обоим. Я хочу, чтобы решение использовало хэш .

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

Ответы [ 2 ]

4 голосов
/ 27 января 2010

Знаете ли вы, что для хэшей может быть вызван специальный процесс, когда ключ не найден?

Это можно использовать здесь очень хорошо.

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'
  }
}
2 голосов
/ 27 января 2010

Одним из способов является использование константы для общих битов, например:

#!/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"}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...