在返回哈希值或零值的方法上使用ruby'或equals'|| =

时间:2010-02-13 13:56:28

标签: ruby hash null

我有一个返回哈希的方法,或者是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 

显然,我的示例运行有点薄,并且还有其他解决此问题的方法,但如果可以使用|| =,我很想知道如何。

谢谢!

3 个答案:

答案 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 }