gpt4 book ai didi

ruby-on-rails - 询问 Ruby 哈希数组

转载 作者:数据小太阳 更新时间:2023-10-29 07:43:48 25 4
gpt4 key购买 nike

我需要在 Ruby 中按年龄对人进行分组。我有他们的出生日期,以及一种以年为单位返回年龄的方法。所以像这样的解决方案可行。

case
when (0..15).cover?(age_years)
'child'
when (16..24).cover?(age_years)
'16 to 24'
when (25..34).cover?(age_years)
'25 to 34'
when (35..44).cover?(age_years)
'35 to 44'
when (45..54).cover?(age_years)
'45 to 54'
when (55..64).cover?(age_years)
'55 to 64'
when age_years > 64
'really old'
else
'unknown'
end

但是,我正在努力学习 Ruby,并且正在寻找更优雅的解决方案。我考虑过将 age_ranges 放入这样的哈希数组中......

age_ranges = [{ name: 'child', min_age: 0, max_age: 15 },
{ name: '16 to 24', min_age: 16, max_age: 24 }]

但我不知道如何查询这些数据以返回正确的名字,其中 age_years 在适当的范围内,甚至是这样的范围内

age_ranges = [{ name: 'child', age_range: '0..15' },
{ name: '16 to 24', age_range: '16..24' }]

看起来更整洁,但我不知道我是否写了乱码,因为我不知道如何在年龄匹配时提取名字。

有人能指出我正确的方向吗?

最佳答案

现在您已经有了年龄名称和范围的映射(注意我使用了 range,而不是字符串作为 age_range 的值),您想要搜索 age_ranges 这样的哈希数组,age_range 的值包括年龄:

def age_ranges
[
{ name: 'child', age_range: 0..15 },
{ name: '16 to 24', age_range: 16..24 }
]
end

def find_age(age)
age_ranges.find { |hash| hash[:age_range].include?(age) }[:name]
end

find_age(12)
#=> "child"
find_age(17)
#=> "16 to 24"

请注意,如果 find 返回 nil(意思是未找到匹配项),[:name] 将失败。

要克服它,要么添加一个无限范围作为数组中的最后一个(我更喜欢这个,因为它更简单):

def age_ranges
[
{ name: 'child', age_range: 0..15 },
{ name: '16 to 24', age_range: 16..24 },
{ name: 'unknown', age_range: 25..Float::INFINITY }
]
end

或者在 find_age 方法中获取年龄的同时处理它:

def find_age(age)
age_ranges.each_with_object('unknown') { |hash, _| break hash[:name] if hash[:age_range].include?(age) }
end

另外,确保处理传递给方法的负数(因为 age_ranges 不包括负数):

def find_age(age)
return 'Age can not be less than 0' if age.negative?
age_ranges.find { |hash| hash[:age_range].include?(age) }[:name]
end

附言在所有这些“注意/确保”之后,我想说@mudasobwa 的回答是最简单的解决方法:)

关于ruby-on-rails - 询问 Ruby 哈希数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888414/

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