【问题标题】:is there a hash equivalent to a custom 'class variables'? (ruby)是否有等效于自定义“类变量”的哈希? (红宝石)
【发布时间】:2011-01-09 19:19:21
【问题描述】:

我使用哈希值在我的代码中存储设置。我想知道我是否可以为我的@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'
   }
} 

【问题讨论】:

    标签: ruby scope class-variables


    【解决方案1】:

    您知道哈希可以在找不到键时调用特殊的过程吗?

    这里可以很好地使用。

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

    【讨论】:

    • @Marc-Andre Lafortune:非常有趣的概念。肯定回答了我的问题。可惜我不能使用“接受”两次。
    【解决方案2】:

    一种方法是对公共位使用常量,如下所示:

    #!/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"}}}
    

    【讨论】:

    • 我明白了,我花了一些时间,但我明白 :-) 是的,这是一种可能的方式。让我们看看其他人是否能想到任何其他...谢谢韦恩
    • 请记住,此解决方案仅在您不动态更改配置的情况下才有效。要找出原因,请创建此散列,修改其中一项配置:@profile['VB4Discussions']['type'] = 'chit chat',然后将散列打印出来。当你理解了你所看到的,你就会知道一些重要的事情。
    • 你的意思是修改公共位会影响所有的配置文件吗?在我看来,我会使用你的想法,但会稍微修改一下。我将向所有配置文件添加新的 COMMON_PROFILE 哈希。
    • 是的,我就是这个意思。你领先于我。
    • 我希望我是 :-))))))))))) 我喜欢你的解决方案,它已经实现并且正在工作。虽然有点不同。我也喜欢下面这张。
    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多