更短的案例陈述

时间:2018-02-02 14:32:38

标签: ruby case

让我们考虑一下这个红宝石代码:

@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语句列表,所以如果我保留它可能会起作用,但它会非常长且难以阅读。我找不到那样的东西。

你知道是否有这样的选择吗?

3 个答案:

答案 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开始。