我有以下情况:
type = "stringX"
someArray = ["stringX", "string1", "string2"]
case type
when "stringA"
puts "a"
when "stringB"
puts "b"
when someArray.any? { |x| x.include?(type) }
puts "x"
when "stringC"
puts "c"
end
我期待发生的是它会经过case
并且一旦它将.any?
方法评估为真(因为它本身确实评估为真),它将{{1 " x"。但是,这不是在这里发生的事情,它只是通过puts
的其余部分,并在其下方的某个地方到达case
。
我想知道这里发生了什么?
答案 0 :(得分:4)
使用*
运算符
value = "stringX"
some_array = ["stringX", "string1", "string2"]
case type
when "stringA"
puts "a"
when "stringB"
puts "b"
when *some_array # notice the * before the variable name!
puts "x"
when "stringC"
puts "c"
end
这是如何运作的?
when *some_array
会检查value
是some_array
答案 1 :(得分:2)
对于这个特殊情况,应该使用@akuhn
的精彩答案您是否需要在case
内添加任意随机条件,您可以使用Proc#===
执行此操作:
type = "stringX"
someArray = ["stringX", "string1", "string2"]
case type
when "stringA" then puts "a"
when "stringB" then puts "b"
# ⇓⇓⇓⇓⇓⇓⇓⇓ HERE
when ->(type) { someArray.any? { |x| x.include?(type) } }
puts "x"
when "stringC" then puts "c"
end
答案 2 :(得分:0)
这种方式不太合适,因为基本上case语句会将给定对象与传递给when
的对象进行比较,与此类似:
if type == "stringA"
# ...
elsif type == "stringB"
# ...
依此类推,除非你使用空案例陈述。
case
when type == "stringA"
# ...
这类似于if elsif语句,所以你不经常看到它。 但是,在您的情况下,我们可以使用Ruby's splat operator
case type
when "stringA"
puts "a"
when "stringB"
puts "b"
when *someArray
puts "x"
when "stringC"
puts "c"
Ruby的case语句可以带有when
的多个参数,这些参数类似于“或”
case "A"
when "B"
puts "B"
when "C", "A"
puts "C or A"
end
# => C or A
并且splat操作符会扇出你的数组:
p ["a", "b"]
# => ["a", "b"]
p *["a", "b"]
# => "a"
# => "b"
p "a", "b"
# => "a"
# => "b"