Ruby - 使用Constant表示'case'语句

时间:2016-12-16 13:44:04

标签: ruby-on-rails ruby

我有一个Ruby案例陈述,如下所示:

case ruby_variable
when "instagram"
  # do this
when "twitter"
  # do that
  # and so on...
else
  "theres an error"
end

我还拥有所有社交网络名称的常量(此列表会随时间变化):

NETWORKS_LIST = 
[   "instagram",
        "twitter",
        "pinterest",
        .......
    ]

我想改变这一点,以便条件值,即“pinterest”,“twitter”和其他人,自动填充到我的case语句中(但保留最后一行“错误“)。

像循环一样:

case ruby_variable
when NETWORKS_LIST[0]
  do this
when NETWORKS_LIST[1]
  do that
and so on...
else
  "theres an error"
end

我不知道如何管理它。

1 个答案:

答案 0 :(得分:2)

通常,您使用类似Array的结构来查找事物和测试有效性,使用Hash来定义映射,或使用case来分支执行。当不止一个涉及到您的解决方案的同一级别时,这是非常不寻常的,即它们以紧密相关的方式使用。

我认为这里有一些令人困惑的事情。这种常量最适合用于查找,例如测试参数是否有效:

NETWORKS_LIST.include?(params[:network])

如果你想在其他地方重复使用该列表中的值,Ruby约定更喜欢符号而不是字符串:

NETWORKS_LIST = [
  :instagram,
  :pinterest,
  :weratedogs
]

然后在你的case声明中:

case params[:network]
when :instagram
  make_instagram_post!
when :pinterest
  make_pin!
when :weratedogs
  bark_incessantly!
else
  raise "Not a valid network."
end

您可以独立维护这两个结构,因为 case语句中包含的其他代码未包含在原始结构中。现在你可以将两者合并:

NETWORKS = Hash.new(-> {
  raise "Not a valid network."
}).merge(
  instagram: -> {
    make_instagram_post!
  },
  pinterest: -> {
    make_pin!
  },
  weratedogs: -> {
    bark_incessantly!
  }
)

这个默认值是一个引发错误的Proc,所以你可以像这样调用它:

NETWORKS[params[:network].to_sym].call

如果填充了params[:network],那么它将执行任何预期或错误输出。

如果您愿意,可以将其进一步发展为一个小型的Ruby。