【问题标题】:Greater than OR equal (based on boolean condition)大于或等于(基于布尔条件)
【发布时间】:2018-05-18 10:27:30
【问题描述】:

什么是大于或等于的简单构造,其中相等部分仅基于布尔参数应用。

一种直接的方式(Type(Java)Script):

function isGreaterThanOrEqual(a: number, b:number, allowEqual: boolean = false): boolean {
  if(allowEqual){
    return a >= b;
  } else {
    return a > b
  }
}

我有一个(旋转的)矩形碰撞检测方法,其中进行了大量的比较。有时我想包含相互接触的矩形,有时不包含(它们必须“真正”重叠),这就是为什么这个可选的allowEqual 参数会派上用场。

我想防止在这种方法中的许多地方都有这个 if 语句,并且更喜欢优雅的单行。

这可以以任何方式在单行中完成吗?

【问题讨论】:

  • return (allowEqual && a >= b) || a > b 也可以。
  • @Federico 甚至返回 (allowEqual && a == b) || a > b 会工作
  • @tehvan 当然,但我认为如果像我一样写的话,意图会更清楚:)
  • 如果你想要优雅,只需将函数重命名为 isGreater。如果在以后的阶段你想采取不同的方法,你只有一个地方可以改变而不是很多。
  • @tehvan 不错的建议,让我补充一下:名为“IsGreaterThan”的函数和名为“orEqual”的参数。

标签: javascript typescript logical-operators


【解决方案1】:

您可以通过返回较大检查的值或检查allowEqual 和身份检查来使用分阶段的方法。

return a > b || allowEqual && a === b;

【讨论】:

    【解决方案2】:
    return (a - b) >= (+(!allowEqual)) * Number.EPSILON;
    

    解释:

    如果allowEqualtrue,它的否定被强制为0,所以a - b 必须至少是0。如果allowEqual 为假,则其否定被强制为1,因此a - b 必须至少是两个数字之间可能的最小距离。

    【讨论】:

    • 聪明,但如果我在代码库中找到类似的东西,我会开始寻找你和你爱的每个人:P
    • 老实说,我也是。这正是我所说的为聪明而聪明的事情;我发布这个更多是出于好奇而不是实际的解决方案。
    • @Federico +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2016-06-18
    • 2013-09-02
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多