相关疑难解决方法(0)

红宝石中哈希成语的哈希?

在Ruby中创建哈希哈希允许方便的两个(或更多)维度查找.但是,插入时必须始终检查散列中是否已存在第一个索引.例如:

h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert
Run Code Online (Sandbox Code Playgroud)

最好在自动创建新哈希的情况下执行以下操作:

h = Hash.new
h['x']['y'] = value_to_insert
Run Code Online (Sandbox Code Playgroud)

类似地,当查找第一个索引尚不存在的值时,如果返回nil而不是接收"[]"错误的未定义方法,则更为可取.

looked_up_value = h['w']['z']
Run Code Online (Sandbox Code Playgroud)

可以创建一个具有此行为的Hash包装类,但是是否存在用于完成此任务的Ruby习惯用法?

ruby idioms hash-of-hashes

34
推荐指数
1
解决办法
5217
查看次数

ruby hash autovivification(facets)

这是一个聪明的技巧,在ruby中启用哈希自动修复(取自facet):

  # File lib/core/facets/hash/autonew.rb, line 19
  def self.autonew(*args)
    leet = lambda { |hsh, key| hsh[key] = new( &leet ) }
    new(*args,&leet)
  end
Run Code Online (Sandbox Code Playgroud)

虽然它有效(当然),但我发现我无法弄清楚这两个衬垫是如何做到的.

leet被置为默认值.所以,然后只是h['new_key']以某种方式访问它,并创建'new_key' => {}

现在,我希望h['new_key']返回默认值对象而不是评估它.也就是说,'new_key' => {}不会自动创建.那么leet实际上是如何被调用的呢?特别是有两个参数?

ruby

8
推荐指数
2
解决办法
2464
查看次数

是否可以在Ruby中自动初始化多维哈希数组,就像在PHP中一样?

我习惯于在PHP中使用多维数组,在那里我可以通过分配和初始化哈希

unset($a); // just to show that there is no variable $a
$a['settings']['system']['memory'] = '1 Gb';
$a['settings']['system']['disk space'] = '100 Gb';
Run Code Online (Sandbox Code Playgroud)

有没有办法在Ruby中做类似的事情?或者我需要先初始化所有维度,然后分配值.是否可以定义一个高级Hash,它可以满足我的需求?你会怎么做?


更新

除了道格拉斯提出的解决方案(见下文)之外,我还找到了一个主题,其中BrianSchröäer提出了该Hash课程的扩展:

class AutoHash < Hash
  def initialize(*args)
    super()
    @update, @update_index = args[0][:update], args[0][:update_key] unless args.empty?
  end

  def [](k)
    if self.has_key?k
      super(k)
    else
      AutoHash.new(:update => self, :update_key => k)
    end
  end

  def []=(k, v)
    @update[@update_index] = self if @update and @update_index
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

当仅仅请求项目值时,例如,当不期望地创建丢失的散列项时,它允许解决该问题a['key'].


一些额外的参考

  1. ruby hash autovivification(facets)
  2. http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
  3. http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml

php ruby hash initialization multidimensional-array

5
推荐指数
1
解决办法
1999
查看次数

如何处理组合[] + =在Ruby中自动生成哈希?

为了实现Ruby哈希的自动生成,可以使用以下类

class AutoHash < Hash
  def initialize(*args)
    super()
    @update, @update_index = args[0][:update], args[0][:update_key] unless 
args.empty?
  end

  def [](k)
    if self.has_key?k
      super(k)
    else
      AutoHash.new(:update => self, :update_key => k)
    end
  end

  def []=(k, v)
    @update[@update_index] = self if @update and @update_index
    super
  end

  def few(n=0)
    Array.new(n) { AutoHash.new }
  end
end
Run Code Online (Sandbox Code Playgroud)

该类允许执行以下操作

a = AutoHash.new
a[:a][:b] = 1
p a[:c] # => {}             # key :c has not been created
p a     # => {:a=>{:b=>1}}  # note, that it does not …
Run Code Online (Sandbox Code Playgroud)

ruby hash autovivification operator-keyword

1
推荐指数
1
解决办法
834
查看次数