本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(十)——作用域和import
本文链接:Scala学习(十)——作用域和import
简介
作用域,是几乎所有高级语言都具有的功能。import
关键字(或者类似的关键字),是几乎所有面向对象语言必备的功能。毫无疑问,在Java虚拟机上运行的Scala,也具有这两个功能。然而,Scala的import
功能并非完全照搬Java的import
,其用法和区别将在本节详解。
import
语句
Java的import
语句放在java文件的起始位置,用于导入类、常量。Scala也有这一功能(Java中的*
被_
替代了):
1 2 |
import java.io._ import java.util.Collections.EMPTY_LIST |
有些在Java中要写多行的语句这里只需写成一行。也就是用大括号包含,再用逗号分隔:
1 |
import java.io.{InputStream, DataInputStream} |
import
语句还可以导入静态方法:
1 2 3 4 5 6 |
import java.util.Arrays.binarySearch object AObj extends App { val arr = Array(1, 3, 4, 6) println(binarySearch(arr, 3)) // 1 } |
import
语句还可以放在程序的任意位置,使得它仅在当前作用域里有效:
1 2 3 4 5 6 7 |
{ import scala.reflect.internal.util.Collections println(classOf[Collections]) // 输出 interface scala.reflect.internal.util.Collections } println(classOf[Collections]) // 输出 class java.util.Collections |
而且,import
语句还可以导入非静态方法:
1 2 3 4 |
val in = new FileInputStream("somefile") import in._ println(read()) close() |
作用域
Scala的作用域并不特别,完全可以参考类似的C语言或者Java的作用域要求。
简而言之就是:对于同名变量来说,大括号内部定义的变量会覆盖大括号外部的变量,局部变量覆盖成员变量,大括号内部import
的类、变量、方法覆盖外部的。只有一种情况比较特殊,就是自身成员不会被import
导入的成员覆盖。
不过实际使用中并不会经常出现变量重名的情况,所以作用域的意义更多在于访问限制。这一条一般来说一句话就可以概括:作用域限定于定义或导入该变量或类的大括号及内层大括号嵌套中。
总结
虽然Scala提供了这么多使用import
的方式,但是使用的时候还是需要小心。一个import
语句可能会影响相当大范围的代码,如果难以找到某句代码对应的import
语句,会影响整体代码的可读性,尤其是导入了非静态方法时,很容易和成员混淆。所以,具体要怎么用,还是看个人的修行了(我自己还是老老实实地像Java那样用吧)。