【发布时间】:2024-01-22 11:12:01
【问题描述】:
试图解决散列中的简单散列上的键/值问题,我快疯了。
我的密钥属于“OpenStudio::OptionalString”类型,它来自我的代码中使用的 API:
#---NOTE---: key here is of type OpenStudio::OptionalString
my_hash[key]['heating_plant_system'] = 'Boiler'
my_value = my_hash[key]['heating_plant_system'] #returning nil
在调试模式下,我检查了哈希,发现第一行正确输入了键/值输入,但在运行第二行时无法检索值。 my_value 将返回零。我知道这是由于这种奇怪的键类型,但我无权更改它。
当我试图从我的哈希中访问这个值时,我犯了一个愚蠢的错误吗?
为了让事情保持一般性,我可能牺牲了太多的上下文。这是一个完整的例子:
require 'openstudio'
model = OpenStudio::Model::Model.new
my_zone = OpenStudio::Model::ThermalZone.new(model)
my_zone.setName('Zone 1')
zone_hash = Hash.new { |h, k| h[k] = { } }
zone_hash[my_zone.name]['heating_plant'] = 'Boiler'
puts "my zone's name is #{my_zone.name}" #Output: 'my zone's name is Zone 1'
puts zone_hash.to_s #Output: {#<OpenStudio::OptionalString:0x5fa4980 @__swigtype__="_p_boost__optionalT_std__string_t">=>{"heating_plant"=>"Boiler"}}
if zone_hash[my_zone.name]['heating_plant'].nil?
puts 'Im unable to access this hash, help!' #<--- this is executed
else
puts "I am able to access #{zone_hash[my_zone.name]['heating_plant']}"
end
由于我无法(轻松地)通过将密钥更改为 OpenStudio::OptionalString 以外的其他内容来撤消 zone_hash 在实际代码库中的工作方式,因此我使用此循环作为解决方法。它不漂亮,但它完成了我需要做的小检查:
zones_hash.each {|k,v|
if zone.name.to_s == k.to_s
v.each {|k1,v1|
if k1 == 'heating_plant'
heating_plant = v1.to_s
end
}
end
}
【问题讨论】:
-
你能显示
my_hash[key].keys的输出吗? -
请阅读“minimal reproducible example”。我们需要最少的输入和预期的输出,以便我们可以测试您的代码和我们所做的任何调整。
-
哈希键可以是任何对象类型,只要对象是唯一的。如果它们不是唯一的,它们将踩在以前的匹配条目上。
-
key是如何初始化的?你从key.to_s得到什么?你可以使用key.to_s作为键吗? -
请不要在文本中使用“编辑”或“更新”类型的标签。而是将附加信息添加到文本中,就好像它从一开始就在那里一样。我们可以看到发生了什么变化,以及何时需要。