案例语句:每个变量具有多种可能性的多个变量

  • 本文关键字:变量 可能性 语句 案例 ruby
  • 更新时间 :
  • 英文 :


首先,我认为该语法有效,但是when似乎只会检查组的第一个值,如果任何第一个值失败,它将返回锁定。对于or操作数不好,在这里不起作用。

def lock(a,b,c,d)
  case [a,b,c,d]
    when[(3||5||7), 2, (5||6), (8||9||0)]
      "unlocked"
    else
      "locked"
  end
end
lock(3, 2, 5, 8)
lock(5, 2, 5, 0)
lock(5, 2, 6, 8)
lock(7, 2, 5, 8)
lock(7, 2, 6, 9)

我可以为每个变量进行其他语句,但是我希望有一种方法可以做一个案例语句,而无需在语句时进行多次多次。

我会选择循环数组而不是使用case语句,例如:

def lock(a,b,c,d)
  combination = [[3,5,7], [2], [5,6], [8,9,0]]
  attempt     = [a,b,c,d]
  combination.each_with_index do |position, i|
    return "locked" unless position.include?(attempt[i])
  end
  "unlocked"
end

输出:

lock(3, 2, 5, 8)
#=> "unlocked"
lock(5, 2, 5, 0)
#=> "unlocked"
lock(5, 2, 6, 8)
#=> "unlocked"
lock(7, 2, 5, 8)
#=> "unlocked"
lock(7, 2, 6, 9)
#=> "unlocked"
lock(1, 2, 3, 4)
#=> "locked"

为什么您的解决方案失败?

正如Hamms在他的评论中指出的那样,具有[(3||5||7), 2, (5||6), (8||9||0)]when评估为[3, 2, 5, 8]。那是因为首先对括号中的每个表达式进行评估,因此,将其分解,它将是:

(3 || 5 || 7)
#=> 3
2
#=> 2
(5 || 6)
#=> 5
(8 || 9 || 0)
#=> 8

这是因为||正在评估值是否为真实,也就是说,既不是nil也不是false。一旦表达到真实的价值,它将返回该价值,而不会再看一看。因此,任何数字都会以真实的评估,因此您将始终获得每个表达式的第一个数字。

回到您的case语句,这与写作完全相同:

case [a,b,c,d]
when [3, 2, 5, 8]
  "unlocked"
else
  "locked"
end

现在考虑case语句将评估case中的对象是否与每个when中的对象相等。因此,您的情况将是:

[a,b,c,d] === [3, 2, 5, 8]

只有在您致电lock(3, 2, 5, 8)

时才会返回true(和"unlocked"(

还认为您可以将多个值与when一起使用,因此使用类似的内容将有效:

case [a,b,c,d]
when [3, 2, 5, 8], [5, 2, 5, 0] then "unlocked"
else "locked"
end

when等于:

[a,b,c,d] === [3, 2, 5, 8] || [5, 2, 5, 0]

正如其他人所解释的那样,此问题不适合使用案例语句。

由于变量似乎是数字,因此您可以将它们转换为字符串并使用正则表达式。

def lock(entry, valid)
  r = /#{valid.map { |a| '['+a.join('|')+']' }.join }/
  entry.join.match?(r) ? 'unlocked' : 'locked'  
end

假设

valid = [[3, 5, 7], [2], [5, 6], [8, 9, 0]]

我们计算valid值的以下正则表达式:

r #=> /[3|5|7][2][5|6][8|9|0]/

尝试:

lock([3, 2, 5, 8], valid) #=> "unlocked"
lock([5, 2, 5, 0], valid) #=> "unlocked"
lock([5, 2, 6, 8], valid  #=> "unlocked"
lock([7, 2, 5, 8], valid) #=> "unlocked"
lock([7, 2, 6, 9], valid) #=> "unlocked"
lock([5, 2, 4, 0], valid) #=> "locked"

最新更新