让我们考虑一下这个红宝石代码:
@name = case @name
when 1 then "Noah"
when 2 then "Liam"
when 3 then "Mason"
when 4 then "Jacob"
when 5 then "William"
when 6 then "Ethan"
when 7 then "James"
when 8 then "Alexander"
when 9 then "Michael"
when 10 then "Benjamin"
when 11 then "Elijah"
when 12 then "Daniel"
when 13 then "Aiden"
when 14 then "Logan"
when 15 then "Matthew"
when 16 then "Lucas"
when 17 then "Jackson"
when 18 then "David"
when 19 then "Oliver"
when 20 then "Jayden"
when 21 then "Joseph"
when 22 then "Gabriel"
when 23 then "Samuel"
when 24 then "Carter"
when 25 then "Anthony"
when 26 then "John"
when 27 then "Dylan"
when 28 then "Luke"
when 29 then "Henry"
when 30 then "Andrew"
end
我强烈怀疑写同样的东西的方式要短得多。形状为@name.case["Noah", "Liam"...]
的东西。甚至LaTeX也有更好的方法来解决这个问题。考虑一下我的程序会有一个非常长的case语句列表,所以如果我保留它可能会起作用,但它会非常长且难以阅读。我找不到那样的东西。
你知道是否有这样的选择吗?
答案 0 :(得分:3)
我们假设您有names
的列表。您可以创建一个将整数映射到它们的哈希
mapping = Hash[(1..names.size).zip(names)]
然后实现一个给定数字的函数,映射规则返回一个名称或其他东西
def id_to_name(id, mapping)
mapping.fetch(id, 'no name')
end
您甚至可以为此创建一个类,因此此方法不需要将映射作为参数
class IdToName
def initialize(names, fallback_name)
@mapping = Hash[(1..names.size).zip(names)]
@fallback_name = fallback_name
end
def get(id)
@mapping.fetch(id, @fallback_name)
end
end
id_to_name = IdToName.new(your_names, 'no name')
puts id_to_name.get(1) # Noah
puts id_to_name.get(1000) # no name
答案 1 :(得分:2)
如果@name
的数值是以0
(或1
)开头的连续值,则包含所有值的简单数组就足够了:
@name = ['', 'Noah', 'Liam', 'Mason', 'Jacob', 'William'][@name]
在'William'
之后,可以随意填写任意数量的名称。
如果密钥不是连续的或者它们不是整数,则可以使用Hash
代替:
@name = { '1': 'Noah', 'three': 'Mason', '5': 'William' }[@name.to_s.to_sym]
答案 2 :(得分:2)
最简单的方法是使用"ITEM1"
快捷方式创建一个数组,以消除无关的标点符号:
%w
您可以添加换行符,额外的空格等。然后使用@name:
简单地索引它们names = %w(Noah Liam Mason Jacob William Ethan James Alexander Michael Benjamin
Elijah Daniel Aiden Logan Matthew Lucas Jackson David Oliver Jayden
Joseph Gabriel Samuel Carter Anthony John Dylan Luke Henry Andrew)
由于names[@name - 1]
的第一个元素是0,你必须从names
中减去一个,或者在开头放一个虚拟元素,这样你就可以从1开始。