检查密钥是否存在;如果不是,则创建数组并附加值

时间:2019-02-16 15:16:15

标签: ruby

示例如下:

if house['windows'][floor_1]
  house['windows'][floor_1] << north_side
else
  house['windows'][floor_1] = [north_side]
end

检查现有密钥的最佳方法?

3 个答案:

答案 0 :(得分:1)

house['windows']已经是哈希中的一个元素,这有点让人讨厌,所以我将windows用作引用哈希的变量。

windows哈希设置默认值,以便为任何不存在的键分配一个数组值:

windows = Hash.new {|hash, key| hash[key] = [] }

现在,您可以自动将(<<)附加到新的哈希元素。

windows['floor_1'] << 'north_side'

windows # => {"floor_1"=>["north_side"]}

对于您的具体情况,将windows替换为house['windows']


编辑

正如评论中指出的那样,可以将这种行为添加到已经实例化的哈希中:

windows.default_proc = proc {|hash, key| hash[key] = [] }

答案 1 :(得分:1)

我想是因为您的哈希值:

house = { windows: { floor_0: ['f0'] } }

您可以使用Hash#has_key?

检查密钥是否存在
house[:windows].has_key? :floor_1 #=> false

因此您可以创建它:

house[:windows].merge!({floor_1: []}) unless house[:windows].has_key? :floor_1


如果您使用例如Hash#default_proc=

来定义默认值,那就更好了。
house[:windows].default_proc = proc { |h, k| h[k] = [] } 

所以你可以

house[:windows][:floor_3] << 'f3'

house #=> {:windows=>{:floor_0=>["f0"], :floor_1=>[], :floor_3=>["f3"]}}

答案 2 :(得分:1)

我会这样:

house['windows'][floor_1] ||= []
house['windows'][floor_1] << north_side