为什么我会得到下面Scala代码片段的输出List((), (), (), ()):
List((), (), (), ())
val ans1 = for(i3 <- 1 to 4) yield { if (i3 % 2 == 0) i3 }
我尝试了以下方法:
预期值:List(2,4)
List(2,4)
cwxwcias1#
如果thenExpr和elseExpr具有类型A,则if (condition) thenExpr else elseExpr也具有类型A。如果thenExpr和elseExpr具有不同的类型,则if ...具有它们的超类型。如果省略elseExpr,则if (condition) thenExpr是if (condition) thenExpr else ()的简写,其中()具有类型Unit。因此,如果thenExpr具有类型Unit,则if (condition) thenExpr具有类型Unit,否则if (condition) thenExpr具有类型,其是某种类型(thenExpr之一)和Unit(即Any或AnyVal)的超类型。这就是()的来源,也是返回类型为Seq[AnyVal]而不是Seq[Int]的原因。只是不要忽略else部分。你也可以使用标准的方法.map,.filter。正如@Always_A_Learner和@Dima建议的那样,你可以试试
thenExpr
elseExpr
A
if (condition) thenExpr else elseExpr
if ...
if (condition) thenExpr
if (condition) thenExpr else ()
()
Unit
Any
AnyVal
Seq[AnyVal]
Seq[Int]
else
.map
.filter
val ans1 = for(i3 <- 1 to 4 if i3 % 2 == 0) yield i3
1条答案
按热度按时间cwxwcias1#
如果
thenExpr
和elseExpr
具有类型A
,则if (condition) thenExpr else elseExpr
也具有类型A
。如果
thenExpr
和elseExpr
具有不同的类型,则if ...
具有它们的超类型。如果省略
elseExpr
,则if (condition) thenExpr
是if (condition) thenExpr else ()
的简写,其中()
具有类型Unit
。因此,如果thenExpr
具有类型Unit
,则if (condition) thenExpr
具有类型Unit
,否则if (condition) thenExpr
具有类型,其是某种类型(thenExpr
之一)和Unit
(即Any
或AnyVal
)的超类型。这就是
()
的来源,也是返回类型为Seq[AnyVal]
而不是Seq[Int]
的原因。只是不要忽略
else
部分。你也可以使用标准的方法.map
,.filter
。正如@Always_A_Learner和@Dima建议的那样,你可以试试