Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala val在if else之外不可访问_Scala - Fatal编程技术网

Scala val在if else之外不可访问

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

为什么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
  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结尾。但这不适用于这里。