我有一个返回哈希的方法,或者是nil:
def person_of_age(age)
some_hash = @array_of_hashes.select { |h| h.age == age }.last
return some_hash
end
我想像这样使用这个哈希:
my_height = 170
my_age = 30
if my_height < self.person_of_age(my_age)['height']
puts "You are shorter than another person I know of the same age!"
end
现在,如果哈希返回nil,ruby不喜欢我使用['height']:
undefined method `[]' for nil:NilClass (NoMethodError)
足够公平,但我怎样才能使用|| =来避免这个问题? 如果该方法确实返回nil,那么我只想说'height'为0。
我尝试了一些事情,但无济于事:
if my_height < self.person_of_age(age)||={ 'height' => 0 }['height']
#...
if my_height < self.person_of_age(age)['height'] ||= 0
显然,我的示例运行有点薄,并且还有其他解决此问题的方法,但如果可以使用|| =,我很想知道如何。
谢谢!
答案 0 :(得分:4)
显而易见的:
(self.person_of_my_age(age) || {'height' => 0})['height']
但不知怎的,这感觉不太正确
答案 1 :(得分:2)
你可以这样做:
if my_height < self.person_of_age(age).nil? ? 0 : self.person_of_age(age)['height']
或者您可以重写person_of_age
方法:
def person_of_age(age)
some_hash = @array_of_hashes.select { |h| h.age == age }.last || {:height => 0}
return some_hash
end
或更简单
def person_of_age(age)
@array_of_hashes.select { |h| h.age == age }.last || {:height => 0}
end
答案 2 :(得分:1)
我不确定这在你的情况下是否有帮助,但Hash的一个功能是
hash.fetch(key) { block_for_code_evaluated_if_key_absent }