一、前言

  前面介绍了Scala的Object,由于中间论文的时间耽误了些时间,接着继续学习Scala的Packaging和Imports

二、Packaging and Imports

  Scala的包用法与Java类似,但更灵活。在class文件顶端使用package语法,并且可以使用带中括号的package语法,与Java相比,Scala的导入有如下特点

    · 可在任何地方使用import声明

    · 可导入类、包、对象

    · 对导入的成员隐藏或者重命名

  并且在Scala中,隐式导入了java.lang._和scala.lang._两个包,_与Java中的*一样,表示导入包下所有的类,除了上述两个包,scala.Predef对象也被隐式导入,可以详细阅读Predef的源代码,里面包含了很多Scala的语法

  2.1 带有中括号符号的包

  1. 问题描述

  你想使用一个嵌套风格的包符号,类似于C++和C#命名空间的符号

  2. 解决方案

  将类放置在有中括号的包名中,如下所示 

package com.hust.grid {
class Foo { override def toString = "I am com.hust.grid.Foo" }
}

  类的规范名字是com.hust.grid.Foo,其等效于如下代码

package com.hust.grid 

class Foo { override def toString = "I am com.hust.grid.Foo" }

  使用这种方法,可以在一个文件中放置多个package,也可以使用“中括号”风格嵌套包

  下面示例展示了三个不同的Foo类,Foo类在不同的包中  

// a package containing a class named Foo
package orderentry {
class Foo { override def toString = "I am orderentry.Foo" }
} // one package nested inside the other
package customers {
class Foo { override def toString = "I am customers.Foo" } package database {
// this Foo is different than customers.Foo or orderentry.Foo
class Foo { override def toString = "I am customers.database.Foo" }
}
} // a simple object to test the packages and classes
object PackageTests extends App {
println(new orderentry.Foo)
println(new customers.Foo)
println(new customers.database.Foo)
}

  输出结果如下 

I am orderentry.Foo
I am customers.Foo
I am customers.database.Foo

  3. 讨论

  可以使用在文件顶端声明包名,但是也可以使用带中括号风格的包名来将多个类和包放置在同一个文件下

  2.2 导入一个或多个成员

  1. 讨论

  你想要将一个或多个成员导入到当前程序的作用域中

  2. 解决方案

  下面是导入一个类的语法 

import java.io.File

  你可以导入多个类 

import java.io.File
import java.io.IOException
import java.io.FileNotFoundException

  或者使用Scala的导入方式 

import java.io.{File, IOException, FileNotFoundException}

  或者导入java.io包下所有的类  

import java.io._

  _与Java中的通配符*含义相同

  3. 讨论

  Scala的导入比Java更的使用为灵活,在Scala中,你可以在任何地方放置导入申明,如Scala文件中可包含多个类或者包,此时,可以在不同的包中声明导入,使得具有不同的作用域 

package foo

import java.io.File
import java.io.PrintWriter class Foo {
import javax.swing.JFrame // only visible in this class
// ...
} class Bar {
import scala.util.Random // only visible in this class
// ...
}

  你甚至可以在方法中、函数中、代码块中放置导入申明

class Bar {
def doBar = {
import scala.util.Random
println("")
}
}

  2.3 对导入成员重命名

  1. 问题描述

  在导入成员时重命名成员以避免命名空间冲突或混淆

  2. 解决方案

  使用下面语法将成员进行重命名  

import java.util.{ArrayList => JavaList}

  在代码中,可以使用如下方式使用 

val list = new JavaList[String]

  也可以一次性重命名多个类 

import java.util.{Date => JDate, HashMap => JHashMap}

  当进行重命名后,之前的名字不能正常使用 

// error: this won't compile because HashMap was renamed
// during the import process
val map = new HashMap[String, String]

  3. 讨论

  重命名成员可以命名空间冲突或混淆 

import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable.{Map => ScalaMutableMap}

  你不仅可以重命名类,也可以重命名类的成员,如方法

  

  2.4 在导入时隐藏类

  1. 问题描述

  当从同一包导入其他成员时,你想要隐藏一个或多个类

  2. 解决方案

  其类似于重命名,但是使用_符号代替重命名的名字,如下面示例隐藏了Random类,但是导入了java.util中的所有其他类

import java.util.{Random => _, _}

  其中,第一个_符号代表隐藏Random类,第二个_符号代码导入所有的其他类,并且导入通配符必须要放在最后,否则发生错误

  

  若需要隐藏多个成员,可以使用如下做法

import java.util.{List => _, Map => _, Set => _, _}

  2.5 使用静态导入

  1. 问题描述

  你想要像Java静态导入那样导入成员,以便可以直接使用成员名字,而不需要加类名的前缀

  2. 解决方案

  使用下面方法导入java.Math中所有的成员

import java.lang.Math._

  此时,你就可以不需要加前缀来使用Math类中的成员

  

  2.6 在任何地方使用Import申明

  1. 问题描述

  你想要在任何地方使用import申明,以便控制作用域和管理代码

  2. 解决方案

  你可以在类定义之前使用导入,然后在类中使用

package foo

import scala.util.Random

class ImportTests {
def printRandom {
val r = new Random
}
}

  也可以在类中导入 

package foo

class ImportTests {
import scala.util.Random
def printRandom {
val r = new Random
}
}

  这使得import的作用域在类中,也可以将import的作用域限制在方法中 

def getRandomWaitTimeInMinutes: Int = {
import com.alvinalexander.pandorasbox._
val p = new Pandora
p.release
}

  还可以将import作用域控制在代码块中

def printRandom {
{
import scala.util.Random
val r1 = new Random // this is fine
}
val r2 = new Random // error: not found: type Random
}

  3. 讨论

  import是按照顺序读取的,放置import的位置也决定了其作用域

// this doesn't work because the import is after the attempted reference
class ImportTests {
def printRandom {
val r = new Random // fails
}
}
import scala.util.Random

  当文件中包含多个类和包时,你可以结合import申明和包引入方法来限制import语句的作用域

package orderentry {
import foo._
// more code here ...
} package customers {
import bar._
// more code here ...
package database {
import baz._
// more code here ...
}
}

三、总结

  本篇博文讲解了Scala中的包和导入方面的知识点,最主要的就是作用域问题,知识点也相对简单,也谢谢各位园友的观看~

【Scala】Scala之Packaging and Imports的更多相关文章

  1. [Scala] Scala基础知识

    Object An object is a type of class that can have no more than one instance, known in object-oriente ...

  2. [scala] scala 集合(⑧)

    1.List 基础操作 2.Set 基础操作 3. TreeSet 排序Set 4. 拉链操作 5. 流 import scala.collection.immutable.TreeSet impor ...

  3. [scala] scala 函数 (⑦)

    1.scala 函数定义 2.scala 高阶函数 3.匿名函数 4.柯里化 import scala.math._ /** * @author xwolf * @date 2017-04-24 9: ...

  4. [Scala]Scala学习笔记七 正则表达式

    1. Regex对象 我们可以使用scala.util.matching.Regex类使用正则表达式.要构造一个Regex对象,使用String类的r方法即可: val numPattern = &q ...

  5. [Scala]Scala学习笔记六 文件

    1. 读取行 读取文件,可以使用scala.io.Source对象的fromFile方法.如果读取所有行可以使用getLines方法: val source = Source.fromFile(&qu ...

  6. [Scala]Scala学习笔记五 Object

    1. 单例对象 Scala没有静态方法或静态字段,可以使用object来达到这个目的,对象定义了某个类的单个实例: object Account{ private var lastNumber = 0 ...

  7. [Scala]Scala学习笔记四 类

    1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...

  8. Scala:scala的一些简单操作命令

    Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. 不太久之前编程语言还可以毫无疑意地归类成“命令式”或者“函数式”或 ...

  9. [Scala]Scala学习笔记三 Map与Tuple

    1. 构造映射 可以使用如下命令构造一个映射: scala> val scores = Map("Alice" -> 90, "Kim" -> ...

随机推荐

  1. 原来JS是这样的 - 提升, 作用域 与 闭包

    引子 长久以来一直都没有专门学过 JS ,因为之前有自己啃过 C++ ,又打过一段时间的算法竞赛(写得一手好意大利面条),于是自己折腾自己的网站的时候,一直都把 JS 当 C 写.但写的时候总会遇到一 ...

  2. MD5算法学习整理

    一路学来 记得笔记不少 但是给自己看 当时就记得很随意 以为后面都懂 但还是太单纯了,现在回顾 自己都完全看不下去,所以以后的都放的博客上,让自己看懂,让感兴趣的看懂,详细,暴力 不废话了 MD5算法 ...

  3. KEEP!

    [list][*]别问我前端有没有前途,我不知道,我只知道我现在喜欢前端,以后也应该喜欢.[*]别问我前端的工作好不好找,不管哪一职位,工作好不好找都是看你的水平.[*]别问我前端累不累,这世界就没有 ...

  4. Redis从入门到精通

    什么是Redis? Redis是非关系型数据库,是一个高性能的key-value数据库,它是开源的,更是免费的. Redis能做什么? 存储数据 Redis的优点有哪些? 1.它支持存储丰富的数据类型 ...

  5. Hibernate框架单向多对多关联映射关系

    建立单向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  6. JNI只C性能测试

    深入学习JNI之前,介绍一个比较好的学习文档:jni详细教程.我这里只是一个Demo测试性能,至于入门教程请看我前一篇博文. Demo展示 这个Demo用于从小到大的冒泡排序,App.java代码: ...

  7. grpc-gateway:grpc对外提供http服务的解决方案

    我所在公司的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,就希望可以做成用rpc来做内部的通讯,对外依然用Restful.于是就想到了google的grpc. 使用grpc ...

  8. 1131: [POI2008]Sta

    1131: [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 783  Solved: 235[Submit][Status] ...

  9. 用Jquery做一个时间日期选择器

    今天我们就用Jquery做一个时间日期选择器,当打开网页时,文本框里面显示的是当前的日期,点击文本框可以出现年.月.日的下拉菜单,并且可以选择,会根据年份的选择判断是否是闰年,从而改变二月的天数,闰年 ...

  10. android开发艺术探索读书笔记之-------view的事件分发机制

    View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...