Scala新手求助:如何访问方法作用域外部的变量?
解决Scala中方法作用域外部访问变量的问题
嘿,我来帮你搞定这个Scala入门问题~ 你遇到的not found: value x错误,核心原因是方法内部的局部变量作用域只限于方法本身,外面的代码根本看不到它。咱们先拆解你原代码里的几个问题,再给出正确的写法:
原代码的问题点
main方法里的val x是局部变量,出了main的大括号就不存在了,所以后面val a = main(x)里的x会报错。- 你调用
main的方式不对:main _是把方法当成函数对象,不是执行它;而且main方法需要的参数是Array[String],不是Int。 println("Input : " + main _)打印的是方法本身,不是你想要的输入值。
正确的解决方式
方式1:让方法返回值(推荐,符合函数式风格)
把main方法改成返回你需要的Int值,这样调用方法后就能把结果存在外部变量里:
// 定义main方法,指定返回类型为Int def main(args: Array[String]): Int = { args(0).toInt // Scala里最后一行代码就是返回值,不用写return } // 调用main方法,传入模拟的命令行参数(实际运行时由JVM传入args) val inputValue = main(Array("123")) println("Input : " + inputValue) // 现在inputValue可以在任何地方使用啦
方式2:使用外部可变变量(不推荐,尽量少用var)
如果一定要在方法外部定义变量,得用var(可变变量),让main方法去修改它:
// 在方法外部定义可变变量,先初始化 var inputValue: Int = 0 def main(args: Array[String]): Unit = { inputValue = args(0).toInt // 修改外部的var变量 } // 调用main方法赋值 main(Array("456")) println("Input : " + inputValue)
更简洁的方式:用App特质
Scala里写简单程序可以用App特质,不用手动写main方法,变量直接定义在全局作用域:
object MyScalaApp extends App { // args就是命令行参数数组,直接用 val inputValue = args(0).toInt println("Input : " + inputValue) // 这里inputValue可以在整个App代码里任意访问 }
小提示
Scala鼓励使用不可变变量(val)和函数式编程风格,所以优先选择方式1或者App特质的写法,尽量避免用var修改外部状态哦~
内容的提问来源于stack exchange,提问作者Rajdip
相关产品推荐
相关产品推荐

