gpt4 book ai didi

Ruby Hash 为我知道存在的键的值返回 nil

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:28 27 4
gpt4 key购买 nike

我快要疯了,试图解决哈希中简单哈希的键/值问题。

我的 key 是“OpenStudio::OptionalString”类型,它来 self 的代码中使用的 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

在 Debug模式下,我检查了散列,发现第一行正确地输入了键/值输入,但是当我运行第二行时,我无法检索该值。 my_value 将返回 nil。我知道这是由于这种奇怪的 key 类型造成的,但我无权更改它。

当我试图从我的散列中访问这个值时,我是不是犯了一个愚蠢的错误?


为了使事情保持笼统,我可能牺牲了太多上下文。这是一个完整的例子:

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

由于我无法通过将 key 更改为 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
}

最佳答案

Ruby 使用 hasheql? 来检查哈希键的相等性。

看起来 OpenStudio::OptionalString 可能无法正确实现这些。如果是这种情况,您最好的解决方案是使用另一个 key 。

Ruby 对哈希键做出以下假设——如果两个对象被认为是相同的键,它们必须返回相同的 hash 值,但是具有相同的哈希值并不意味着它们是相同的 key 。 eql? 方法在内部用于解决这些情况。

您还可以修复 OpenStudio::OptionalString 类上的 hasheql? 方法,但也许该库依赖于“ splinter ”的内部行为。这就是为什么我建议只使用另一个哈希键,例如这些对象的字符串表示。

关于Ruby Hash 为我知道存在的键的值返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41753945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com