Scala开发教程(54): 使用import

jerry Scala 2015年11月25日 收藏

和Java一样,Scala也是通过import语句引用其它包中定义的类型,类型引入后,可以使用短名称来引用该类型而无需使用全路径。要注意的Scala使用“_” 而非?*?作为通配符。

  1. //easy access to Fruit
  2. import bobsdelights.Fruit
  3.  
  4. //easy access to all members of bobdelights
  5. import bobsdelights._
  6.  
  7. //easy access to all member of Fruits
  8. import bobsdelights.Fruits._
  9.  

所定义的类型中包bobsdelights中:

  1. package bobsdelights
  2.  
  3. abstract class Fruit(
  4. val name: String,
  5. val color:String
  6. )
  7.  
  8. object Fruits{
  9. object Apple extends Fruit ("apple","red")
  10. object Orange extends Fruit("orange","orange")
  11. object Pear extends Fruit("pear","yellowish")
  12. val menu=List(Apple,Orange,Pear)
  13. }

第一个为引用单个类型,第二个为按需引用,和Java不同的是,是使用“_”代替“*”,第三个类似于Java中的静态引用,可以直接使用Fruits中定义的对象。

此外Scala中的import语句的使用比较灵感,可以用在代码的任意部分,而不一定需要在文件开头定义。比如下面 import定义在函数内部:

  1. import bobsdelights.Fruit
  2.  
  3. def showFruit(fruit:Fruit){
  4. import fruit._
  5.  
  6. println(name+"s are" + color)
  7. }

方法showFruit 引入fruit对象(非类型)的所有成员,fruit的类型为Fruit,因此可以在函数直接使用fruit的成员变量,而无需使用fruit限定符。这个方法和下面代码是等价的:

  1. import bobsdelights.Fruit
  2.  
  3. def showFruit(fruit:Fruit){
  4. println(fruit.name+"s are" + fruit.color)
  5. }

和Java相比,Scala的import的使用更加灵活:

  • 可以出现在文件中任何地方
  • 可以import对象(singleton或者普通对象)和package本身
  • 支持对引入的对象重命名或者隐藏某些类型

下面的例子直接引入包名称,而非包中成员,引入包后,可以使用相对名称来指代某个类型(有些类型文件系统的路径)

  1. import java.util.regex
  2.  
  3. class AStarB {
  4. val pat= regex.Pattern.compile("a*b")
  5. }

import 也可以用来重命名或者隐藏某些类型,比如:

  1. import Fruits.{Apple,Orange}

仅仅引用Fruits中的Apple和Orangle类型。
下面的例子使用=>重命名类型:

  1. import Fruits.{Apple=>MaIntosh,Orange}

同样重命名也可以重新定义包名称,比如

  1. import java.{sql => S}

将引入的包java.sql 该名为 java.S 因此可以使用 S.Date 来代替 sql.Date

如果需要隐藏某个类型,可以使用 Type => _ ,将某个类型改名为_就达到隐藏某个类型的效果,比如

  1. import Fruits.{Apple=>_,_}

这个引用,引入Fruits中除Apple之外的其它类型。