。任何?在未按预期评估的案例块内

时间:2016-12-27 08:21:31

标签: ruby switch-statement

我有以下情况:

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

我想知道这里发生了什么?

3 个答案:

答案 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会检查valuesome_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)

编辑:我不会删除答案,因为我认为之前可能有一些你不知道的东西,但它对你的用例不起作用。为此,你应该看看mudasobwas回答

这种方式不太合适,因为基本上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"