我有一个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
我不知道如何管理它。
答案 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。