Использование ruby ​​'or equals' || = для методов, которые возвращают хеш или ноль - PullRequest
2 голосов
/ 13 февраля 2010

У меня есть метод, который возвращает хэш или ноль:

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, давайте просто скажем, что я хочу, чтобы высота была равна 0.

Я пытался делать то же самое, но безрезультатно:

if my_height < self.person_of_age(age)||={ 'height' => 0 }['height']
#...
if my_height < self.person_of_age(age)['height'] ||= 0 

Ясно, что мой пример немного слабоват, и есть другие способы решения этой проблемы, но если можно использовать || =, я бы хотел узнать, как.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 13 февраля 2010

очевидно:

(self.person_of_my_age(age) || {'height' => 0})['height']

но почему-то это не так хорошо

2 голосов
/ 13 февраля 2010

Вы можете сделать это так:

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
1 голос
/ 15 февраля 2010

Я не уверен, поможет ли это в ваших обстоятельствах, но у Hash есть одна возможность

hash.fetch(key) { block_for_code_evaluated_if_key_absent }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...