【问题标题】:Ruby: conditional matrix? case with multiple conditions?红宝石:条件矩阵?有多个条件的情况?
【发布时间】:2011-07-03 22:10:48
【问题描述】:

在 ruby​​ 中,我想知道是否有办法执行以下操作:

我基本上有四个可能结果的矩阵:

A is True, B is True
A is True, B is False
A is False, B is True
A is False, B is False

我想以最简洁的“红宝石方式”为此编写一个测试。

我希望做类似的事情

case[A,B]
  when A && B then ...
  when A && !B then ...
  when !A && B then ...
  when !A && !B then ...
end

...但这不起作用。那么,处理这种情况的最佳方法是什么?

【问题讨论】:

  • 标准缩进将 when 置于 case 级别。

标签: ruby matrix conditional switch-statement


【解决方案1】:

不确定是否有标准的 Ruby 方式,但您可以随时将它们转换为数字:

val = (a ? 1 : 0) + (b ? 2 : 0)
case val
  when 0 then ...
  when 1 then ...
  when 2 then ...
  when 3 then ...
end

或者有一个procs数组并做

my_procs[a][b].call()

【讨论】:

  • +1 用于老式 C 技巧。我会使用0b010b10 来明确表示您实际上是在构建位图,而不仅仅是添加整数。
  • 如果你喜欢:[a, b].each_with_index.map { |x, i| (x ? 1 : 0) ;-)
  • 初级的东西,这不是社区驱动的方式,你最好打开一个问题并让核心团队也看看它@andrew
【解决方案2】:

布尔大小写(case 中没有表达式,它返回第一个带有 truthy when_expr 的分支):

result = case
when A && B then ...
when A && !B then ...
when !A && B then ...
when !A && !B then ...
end

匹配大小写(用case中的表达式,返回第一个满足谓词when_expr === case_expr的分支):

result = case [A, B]
when [true, true] then ...
when [true, false] then ...
when [false, true] then ...
when [false, false] then ...
end

【讨论】:

  • 好的,第二个选项就是我要找的。太棒了!
  • 很好的第二个解决方案。
  • 太棒了!这是一个真值表!
【解决方案3】:

如果您正在寻找具有一个条件但有多个匹配器的案例..

case @condition
  when "a" or "b"
    # do something
  when "c"
    # do something
end

..那么你确实需要这个

case @condition
  when "a", "b"
    # do something
  when "c"
    # do something
end

这可以改写为

case @condition
  when ("a" and "b")
    # do something
  when "c"
    # do something
end

但这有点违反直觉,因为它相当于

if @condition == "a" or @condition == "b"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2023-04-03
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多