三元运算符如何处理比较运算符(宇宙飞船运算符)

Posted

技术标签:

【中文标题】三元运算符如何处理比较运算符(宇宙飞船运算符)【英文标题】:How will comparison operators (spaceship operator) be handled in ternary operators 【发布时间】:2015-06-10 06:17:54 【问题描述】:

这个问题有点先发制人,因为 php 7 还没有发布。我很好奇宇宙飞船运算符在三元运算符的上下文中会如何处理。

所以如果我有一个前宇宙飞船的三元表达式,例如:

$foo = 1;
$bar = 0;
echo 'foo is ' . ( ($foo > $bar) ? 'greater than' : ( ($foo < $bar ) ? 'less than' : 'equal to' ) ) . ' bar.';

使用比较运算符的等效三元运算符是什么?三元组是否会有一些方法来处理这种情况?我经常使用三元运算符,我很好奇是否有某种方法可以在与比较运算符相关的各种情况下简化代码。

【问题讨论】:

将你的字符串粘贴到一个数组中,使用 spaceship 运算符的结果(可能通过 +1 调整)来索引该数组? 这个问题有点先发制人 我认为现在是开始询问和尝试 php 7 的最佳时机。由于发布可能会在今年。所以我更喜欢现在开始使用 php 7,而不是等 5 年,直到每个人都使用它。仅供参考:您可以在这里测试 php 7 的东西:3v4l.org 或者您甚至可以下载 php 解析器并安装它:github.com/nikic/PHP-Parser/releases/tag/v1.2.2 【参考方案1】:

从its RFC 的文档中可以看出,宇宙飞船运算符主要用于处理订单。

我认为这对缩短您发布的代码没有帮助,主要是因为三元运算符需要一个布尔值,而三元运算符在两种情况下都返回一个“真”值(1 和 -1)值是不同的。换句话说,当您将其返回值转换为布尔值时,spaceship 运算符等效于 != 运算符。

无论如何,你可以在 3v4l.org 上进行试验,就像我在 here 做的那样

【讨论】:

【参考方案2】:

这是使用 spaceship operator &lt;=&gt; 作为穷人的三向“三元”的巧妙方法,同样使用箭头函数和数组解构。

<?php
$relation = fn($a, $b) => [
    -1 => 'less than',
     0 => 'the same as',
     1 => 'greater than'
][$a <=> $b];

$bar = 2;

// loop $foo from 1 through 3
foreach (range(1,3) as $foo) 
  echo "foo is " . $relation($foo, $bar) . " bar.\n";

?>

输出:

foo is less than bar.
foo is the same as bar.
foo is greater than bar.

但要小心:它聪明,聪明的代码总是需要更多的脑力才能理解,这使得它的可维护性降低。所以有警告。

【讨论】:

以上是关于三元运算符如何处理比较运算符(宇宙飞船运算符)的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符判断

el-table-column prop使用三元运算符(动态展示数据)

JAVA语言运算符(算数运算符赋值运算符比较运算符逻辑运算符三元运算)

Javascript 数值比较运算符究竟是如何处理字符串的?

如何用三元运算符(?:)替换“if”语句?

php基础:三元运算符及比较3个数的大小