如何使用if-else表达式在scala中指定不同的变量名

如何使用if-else表达式在scala中指定不同的变量名,scala,if-statement,Scala,If Statement,我试图为if-else表达式返回的每个值分配不同的变量名。这是因为我希望稍后在程序中使用返回值,如何使用它取决于执行哪个分支(if或else) 例如: if(5<1) {val x = 5;x} else {val y = 1; y} 期望输出: y: Int = 1 谢谢使用选项跟踪您的计算结果如何 scala 2.13.0-M4> val (x,y) = if (true) (Some(42), None) else (None, Some(17)) x: Option[In

我试图为if-else表达式返回的每个值分配不同的变量名。这是因为我希望稍后在程序中使用返回值,如何使用它取决于执行哪个分支(if或else)

例如:

if(5<1) {val x = 5;x} else {val y = 1; y}
期望输出:

y: Int = 1

谢谢

使用
选项
跟踪您的计算结果如何

scala 2.13.0-M4> val (x,y) = if (true) (Some(42), None) else (None, Some(17))
x: Option[Int] = Some(42)
y: Option[Int] = None

scala 2.13.0-M4> x.map(_ + 1).orElse(y.map(_ * 2))
res0: Option[Int] = Some(43)

scala 2.13.0-M4> val (x,y) = if (false) (Some(42), None) else (None, Some(17))
x: Option[Int] = None
y: Option[Int] = Some(17)

scala 2.13.0-M4> x.map(_ + 1).orElse(y.map(_ * 2))
res1: Option[Int] = Some(34)

使用
选项
跟踪您的计算结果如何

scala 2.13.0-M4> val (x,y) = if (true) (Some(42), None) else (None, Some(17))
x: Option[Int] = Some(42)
y: Option[Int] = None

scala 2.13.0-M4> x.map(_ + 1).orElse(y.map(_ * 2))
res0: Option[Int] = Some(43)

scala 2.13.0-M4> val (x,y) = if (false) (Some(42), None) else (None, Some(17))
x: Option[Int] = None
y: Option[Int] = Some(17)

scala 2.13.0-M4> x.map(_ + 1).orElse(y.map(_ * 2))
res1: Option[Int] = Some(34)

下面是如何使用
执行此操作,如各种注释中所述

根据以下条件创建
的实例:

val e = Either.cond(5 < 1, 5, 1)
要使用
Left
Right
计算值,请使用fold:

val res = e.fold(y => y + 1, x => x*2) 

在这种情况下,
res
2
。令人困惑的是,这里的参数顺序是
然后
,与
cond
相反,这里是如何使用
来实现这一点,如各种注释中所述

根据以下条件创建
的实例:

val e = Either.cond(5 < 1, 5, 1)
要使用
Left
Right
计算值,请使用fold:

val res = e.fold(y => y + 1, x => x*2) 


在这种情况下,
res
2
。令人困惑的是,这里的参数顺序是
然后
,与
cond
相反的顺序

在每种情况下,另一个变量的值应该是什么?例如,如果条件为false,那么
x
的值应该是多少?或者,您的意图是,根据条件,只有一个变量在范围内?如果是这样,您是否希望将未定义的变量错误延迟到运行时?@sepp2k,如果x为false,则我根本不使用,而是使用y。所以一个变量在作用域中。某个变量是否在代码的某个特定位置上是一个必须在编译时回答的问题。运行时将计算
if else
条件下的布尔值。你的请求毫无意义。为什么不写
valz=if(5)“如果x为false,我根本不使用,但我使用y。”如何确保这一点?是否将所有使用
x
y
的代码放入具有相同条件的
if
中?如果
x
y
if
之外使用(但如果它们在
if
内部使用,则不会发生错误)?如果不是,那么值应该是什么?您是否也希望能够在
if
中使用
x
y
,并使用等效值(但在语法上不相同)条件?在每种情况下,另一个变量的值应该是什么?比如,如果条件为false,那么
x
的值应该是什么?或者您的意图是,根据条件,只有一个变量在范围内?如果是,您希望未定义的变量错误延迟到运行时吗?@sepp2k,如果x为false,我不知道“我根本不用,但我用的是y。所以作用域中有一个变量。某个变量是否在代码的某个特定位置是一个必须在编译时回答的问题。在
if-else
条件下的布尔值将在运行时计算。您的请求没有意义。为什么不编写
val z=if?”(5)“如果x为假,我根本不用,但我用的是y。”你如何确保?你只是把所有使用
x
y
的代码放入具有相同条件的
if
s中吗?如果
x
y
在此类
if
之外使用,你会期望编译器生成错误吗(但如果它们在这样的
if
中使用,则不会使用)。如果不是,那么值应该是什么?您是否也希望能够在
if
中使用
x
y
,并使用等效的(但在语法上不相同)条件?最好使用
选项,而不是
选项,因为您只有一个有效值。@Tim更好。我忘了如何操作左/右,所以下次我将分配半小时重新读取scaladoc。可能只是模式匹配。您可以将折叠与
选项一起使用。以下是两者的等效项
e.fold(+1,*2)
如果你真的喜欢
x
y
名字,那么
e.fold(x=>x+1,y=>y*2)
@Ethan谢谢,我会尽量在不太沮丧的某个早上更新答案。我之前的评论很贴切,我没有经常使用这两个选项来写一个快速的答案。最好使用
或者
选项,而不是
选项,因为你只有一个有效值。@Tim更好。我忘了如何操作左/右,因此,下次我将分配半小时重新阅读scaladoc。可能只是模式匹配。您可以将fold与
一起使用。以下是等效的
e.fold(+1,*2)
如果您真的喜欢
x
y
名称,那么
e.fold(x=>x+1,y=>y*2)
@Ethan谢谢,我会尽量在不太沮丧的某个早上更新答案。我之前的评论与此密切相关,我没有经常使用这两种方法来写一个快速的答案。