Scala val在if else之外不可访问
为什么IntelliJ抱怨无法解析以下代码段中的符号“字段”Scala val在if else之外不可访问,scala,Scala,为什么IntelliJ抱怨无法解析以下代码段中的符号“字段” val condition: String = "aa" if (condition == "aa") { val fields: Int = 2 } else if (condition == "bb") { val fields: Int = 3 } else if (condition == "cc") { val fields: Int = 4 } var g = 1 w
val condition: String = "aa"
if (condition == "aa") {
val fields: Int = 2
} else if (condition == "bb") {
val fields: Int = 3
} else if (condition == "cc") {
val fields: Int = 4
}
var g = 1
while (g < fields) {
//do something
g = g + 1
}
val条件:String=“aa”
如果(条件=“aa”){
val字段:Int=2
}否则如果(条件==“bb”){
val字段:Int=3
}否则如果(条件=“cc”){
val字段:Int=4
}
var g=1
而(g<场){
//做点什么
g=g+1
}
第12行中名为字段的三个变量均不在范围内。变量的范围从其定义开始,在封闭块结束时结束
因此,第4行的变量字段
在第5行的}
范围内,第6行的变量在第7行的范围内,第8行的变量在第9行的范围内
您想要的是在if
s之外定义字段。为此,您可以使用这样一个事实:如果
s是Scala中的表达式,那么这是可行的:
val fields =
if (condition == "aa") {
2
} else ...
我想应该是这样的,字段
不在范围内,if else
表达式应该确保返回一个Int
val condition: String = "aa"
val fields: Int = if (condition == "aa") 2
else if (condition == "bb") 3
else if (condition == "cc") 4
else 0
var g = 1
while (g < fields) {
//do something
g = g + 1
}
val条件:String=“aa”
val字段:Int=if(条件==“aa”)2
如果(条件=“bb”)3
如果(条件=“cc”)4
其他0
var g=1
while(g
这是因为词法范围界定
查看您的代码,您可能会感兴趣地知道如果scala
中的是一个表达式,这意味着它们有一个值
示例:
val x:Int=if(条件)4其他5
可读性为王:
val condition: String = "aa"
val fields = condition match {
case "aa" => 2
case "bb" => 3
case "cc" => 4
}
var g = fields
val字段:Int=if(condition==“aa”)2 else-if(condition==“bb”)3 else 4
或val字段:Int=condition-match{case“aa”=>2;case“bb”=>3;case}
将类型指定为“Int”并向其提供if-else结构不起作用。@KoenDeCouck我刚刚复制粘贴了确切的Xavier代码(使用if-else)到我的Scala 2.12 REPL-它工作得很好。匹配也很好。没有类型的版本(不知道为什么要使用这些)我的错误是,它确实可以与Xavier的代码一起工作,使用“Int”。我试着使用其他数据类型(即List)它们的行为似乎没有什么不同。仍在学习中。Val‘fields’确实可以通过这种方式访问,但这是否会将‘fields’的类型更改为Int以外的类型?例如,我注意到Val fields:Int=if…不起作用('类型Any的表达式不符合预期的Int类型)。如果以后使用特别需要“Int”类型变量的方法,这会导致问题。@KoenDeCouck字段的类型将是if
的所有分支的通用类型。因此,如果在所有情况下(包括else情况)都生成Int
,您将得到类型Int
。我也更喜欢模式匹配版本。我可以问一下,为什么在这种情况下在匹配的周围用简单的括号括起来吗?不,我的答案不好,所以我会纠正这一点。但是,答案是,在不同的上下文中,即通过交换机映射集合,我通常需要括号来附加一些内容).filter或).sum或.mkString结尾。但这不适用于这里。