不同行为的三元运算符 - 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 与扩展运算符 (...)的主要内容,如果未能解决你的问题,请参考以下文章
<JDK8 兼容性中的 Java 三元运算符与 if/else