使用 ruby​​“或等于”; ||= 返回散列或 nil 的方法

发布于 2024-08-21 09:13:11 字数 818 浏览 3 评论 0原文

我有一个返回散列或 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,那么我们就说我希望“高度”为 0。

我已经尝试了以下方法,但无济于事:

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

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

谢谢你!

I have a method that returns a hash, or nil:

def person_of_age(age)
  some_hash = @array_of_hashes.select { |h| h.age == age }.last
  return some_hash
end

I want to use this hash like so:

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

Now, if the hash returns nil, ruby doesn't like me using ['height']:

undefined method `[]' for nil:NilClass (NoMethodError)

Fair enough, but how can I use ||= to avoid this problem?
If the method does return nil, let's just say I want the 'height' to be 0.

I have tried things along the lines of, to no avail:

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

Clearly my example is running a little thin, and there are other ways around this problem, but if ||= can be used I'd love to know how.

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦断已成空 2024-08-28 09:13:11

显而易见:

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

但不知怎的,这感觉不太对劲

obvious:

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

but somehow this does not feel so right

悟红尘 2024-08-28 09:13:11

你可以这样做:

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

You can do it like this:

if my_height < self.person_of_age(age).nil? ? 0 : self.person_of_age(age)['height']

Or you can rewrite person_of_age method:

def person_of_age(age)
  some_hash = @array_of_hashes.select { |h| h.age == age }.last || {:height => 0}
  return some_hash
end

or simpler

def person_of_age(age)
  @array_of_hashes.select { |h| h.age == age }.last || {:height => 0}      
end
北风几吹夏 2024-08-28 09:13:11

我不确定这对您的情况是否有帮助,但哈希具有的一项功能是

hash.fetch(key) { block_for_code_evaluated_if_key_absent }

I'm not sure if this helps in your circumstance, but one capability Hash has is

hash.fetch(key) { block_for_code_evaluated_if_key_absent }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文