不同行为的三元运算符 - if/else 与扩展运算符 (...)

Posted

技术标签:

【中文标题】不同行为的三元运算符 - if/else 与扩展运算符 (...)【英文标题】:Different behavior ternary operator - if/else with spread operator (...) 【发布时间】:2021-12-08 09:30:52 【问题描述】:

为什么下面的代码适用于 if/else 而不是三元运算符?

ListView(
  children: [
    // Commented code not working
    // isLogged ? ...loggedRows(context) : loginRow(context),
    
    // Working code
    if (isLogged)
      ...loggedRows(context)
    else
      loginRow(context),

    ListTile(...),
    ListTile(...),
  ])

loggedRows 和 loginRow 方法:

  ListTile loginRow(BuildContext context) 
    return ListTile(...)
  

  List<ListTile> loggedRows(BuildContext context) 
    return [ListTile(...), ListTile(...)];
  

我尝试根据用户是否登录显示不同的 ListTiles,并且使用 if/else 可以完美运行,但是当我尝试对三元运算符执行相同操作时,我得到了错误。

我尝试了几种括号组合,但没有一个对我有用。

使用最简单的模式,如注释代码,我在 Dart 分析中得到 3 个错误:

预计会找到“]”。 预计会找到“.”。 需要一个标识符。

不应该表现相同的三元运算符和 if/else 吗?

为什么会出现这些错误?

有谁知道使用三元运算符的正确语法是什么?

谢谢!

【问题讨论】:

和这个thread一样 是的,你是对的。抱歉,我没有发现那个威胁。无论如何......它不应该与三元运算符一起使用吗?如果没有,为什么不呢? 这两个不一样。三元运算符是表达式,if else 是语句 @pedropimont 不完全是,if-else 在这种情况下是 collection-if,它更类似于表达式而不是语句。 【参考方案1】:

您对三元运算符的使用不起作用,因为每个“then”和“else”操作数(以及三元运算符本身的结果)都必须计算为表达式,并且扩展运算符 (... ) 不会产生表达式。展开运算符(以及 collection-if 和 collection-for)取而代之的是一个或多个集合元素。 (我强烈推荐阅读Bob Nystrom's article that discusses the design of these language features。)

如果您将展开运算符移出,则可以使用三元运算符:

...(isLogged ? loggedRows(context) : [loginRow(context)]),

虽然这更尴尬,因为如果isLogged 为假,它会创建一个额外的List。改用 collection-if 会更适合这种用法。

【讨论】:

以上是关于不同行为的三元运算符 - if/else 与扩展运算符 (...)的主要内容,如果未能解决你的问题,请参考以下文章

if/else vs 三元运算符

Java中与if else相比三元运算符的弊端?

<JDK8 兼容性中的 Java 三元运算符与 if/else

js三元运算符与循环

JavaScript 三元运算符变成完整的 if/else 语句问题

java java.java中的三元if else运算符