Scala变量模式:未分配变量
在《不耐烦的第二版》的Scala中,作者说: 如果case关键字后跟变量名,则匹配 表达式被指定给该变量 同样,在中也给出了类似的陈述 我使用的是Scala 2.13。因此,我有以下代码:Scala变量模式:未分配变量,scala,variables,pattern-matching,Scala,Variables,Pattern Matching,在《不耐烦的第二版》的Scala中,作者说: 如果case关键字后跟变量名,则匹配 表达式被指定给该变量 同样,在中也给出了类似的陈述 我使用的是Scala 2.13。因此,我有以下代码: object helloworld extends App { val a: Any = 1 val x = a match{ case 2 => 22 case m: String => "aa" case n: Int => 11 } print
object helloworld extends App {
val a: Any = 1
val x = a match{
case 2 => 22
case m: String => "aa"
case n: Int => 11
}
println(s"$x $m $n")
}
IDE报告错误:找不到值m和n。现在,即使我事先定义了m和n变量,它们也不会像书中所说的那样赋值:
Scala 2.13有什么不同的地方吗,或者我做错了什么?
谢谢。您的范围有问题。m和n在模式匹配案例外部不可见
这项工作:
object helloworld extends App {
val a: Any = 1
val x = a match{
case 2 => 22
case m: String =>
println(s"m = $m")
"aa"
case n: Int =>
println(s"n = $n")
11
}
println(s"x = $x")
}
印刷品:
n = 1
x = 11
x = 11
m = () n = 1
更新问题的解决方案::
印刷品:
n = 1
x = 11
x = 11
m = () n = 1
但这不是好的Scala风格 您有一个范围问题。m和n在模式匹配案例外部不可见
这项工作:
object helloworld extends App {
val a: Any = 1
val x = a match{
case 2 => 22
case m: String =>
println(s"m = $m")
"aa"
case n: Int =>
println(s"n = $n")
11
}
println(s"x = $x")
}
印刷品:
n = 1
x = 11
x = 11
m = () n = 1
更新问题的解决方案::
印刷品:
n = 1
x = 11
x = 11
m = () n = 1
但这不是好的Scala风格 这句话太草率了: 如果case关键字后面跟一个变量名,则会将匹配表达式指定给该变量 案例表达式不会指定给现有变量,而是创建一个仅在案例主体中可用的新变量 应改为: 如果case关键字后跟一个变量名,则会创建一个具有该名称的变量,并将匹配值分配给该变量。变量的范围是案例主体的范围
这句话很草率: 如果case关键字后面跟一个变量名,则会将匹配表达式指定给该变量 案例表达式不会指定给现有变量,而是创建一个仅在案例主体中可用的新变量 应改为: 如果case关键字后跟一个变量名,则会创建一个具有该名称的变量,并将匹配值分配给该变量。变量的范围是案例主体的范围
查看我的更新答案。查看我的更新答案。