快学Scala第7章----包和引入

2024-05-06 07:58
文章标签 scala 引入 快学

本文主要是介绍快学Scala第7章----包和引入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

快学Scala第7章—–包和引入

本章要点

  • 包也可以像内部类那样嵌套
  • 包路径不是绝对路径
  • 包声明链x.y.z并不自动将中间包x和x.y变成可见
  • 位于文件顶部不带花括号的包声明在整个文件范围内有效
  • 包对象可以持有函数好变量
  • 引入语句可以引入包、类和对象
  • 引入语句可以出现在任何位置
  • 引入语句可以重命名和隐藏特定成员
  • java.lang、scala和Predef总是被引入

要增加条目到包中:

package com {package horstmann {package impatient {class Employee...}}
}

这样你就可以在任意的地方以com.horstman.impatient.Employee访问到了Employee类。 与对象或这类的定义不同,同一个包可以定义在多个文件中。


作用域规则

Scala的包和其他作用域一样的支持嵌套,你可以访问上层作用域中的名称:

package com {package horstman {object Utils {def percentOf(value: Double, rate: Double) = value * rate / 100...}}package impatient {class Employee {...def giveRise(rate: Double) {salary += Utils.percentOf(salary, rate)}}}
}

在不同的文件中定义一个包,可能会出现一个问题:两个文件在定义包时覆盖了正确的包;

// 在一个文件中
package com {package horstmann {package impatient {class Manager {val subordinates = new collection.mutable.ArrayBuffer[Employee]...}}}
}// 在另一个文件中
package com {package horstmann {package collection {...}}
}

由于Scala允许使用相对路径的包名,自定义了collection之后,在com的作用域中就会使用自定义的包,就会在自定义的包中找ArrayBuffer,这样是错误的。解决方法之一是使用绝对包名,以root开始:

val subordinates = new _root_.scala.collection.mutable.ArrayBuffer[Employee]

另一种做法是使用串联式包语句,例如:

package com.horstmann.impatient {// com和horstmann的成员在这里不可见class Manager {val subordinates = new collection.mutable.ArrayBuffer[Employee]...}
}

现在com.horstmann.collection包不再能够以collection 访问到了。


文件顶部标记法

在文件的顶部使用package语句,不带花括号:

package com.horstmann.impatient
package peopleclass Person
...// 这等同于
package com.horstmann.impatient {package people {class Person...// 直到文件末尾}
}

因此,你可以直接引用com.horstmann.impatient包中的内容。


包对象

包可以包含类、对象和特质,但不能包含函数或变量的定义。每个包都可以有一个包对象,你需要在父包中定义它,且名称与子包一样:

package com.horstmann.impatientpackage object people {val defaultNmae = "John Q. Public"
}package people {class Person {val name = defaultName  // 从包中拿到的常量}...
}

在这里,使用defaultName时不需要加上限定词,因为它位于同一个包内。在其他地方,这个常量可以用com.horstmann.impatient.people.defaultNmae访问到。
在幕后,包对象被编译成带有静态方法和字段的JVM类,名为package.class,位于相应的包下。


包可见性

在Java中,没有被声明为public、private、protected的类成员在包含该类的包中可见。在Scala中可以通过修饰符达到同样的效果。

package com.horstmann.impatient.peopleclass Person {private[people] def description = "A person whith name " + name  // people包中可见// 扩展至上层包可见private[impatient] def description = "A person whith name " + name
}

引入

引入语句可以让你使用更短的名称:

import java.awt.Color
// 引入某个包的全部成员
import java.awt._    // 这与Java中的通配符'*'一样// 你也可以引入类或对象的所有成员
import java.awt.Color._
val c1 = RED    // Color.RED
val c2 = decode("#ff0000") // Color.decode

任何地方都可以声明引用

class Manager {import scala.collection.mutable._val subordinates = new ArrayBuffer[Employee]...
}

重命名和隐藏方法

在Java和Scala中都有HashMap,用过两个都被引用了则会导致冲突。解决办法就是使用选取器,将某一个HashMap重命名或者干脆直接隐藏掉(前提是你不会使用到它)。

// 选取器
import java.awt.{Color, Font}// 重命名某个成员
import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable._// 隐藏某个成员
import java.util.{HashMap => _, _}
import scala.collection.mutable._

隐式导入

每个Scala程序都隐式的以如下代码开始

import java.lang._
import scala._
import Predef._

scala这和引入会覆盖java.lang包中冲突的成员。

这篇关于快学Scala第7章----包和引入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963829

相关文章

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

YOLOv8改进实战 | 注意力篇 | 引入CVPR2024 PKINet 上下文锚点注意力CAAttention

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成功的 YOLO 版本的基础上,并引入了新的功能和改进,以

fetch-event-source 如何通过script全局引入

fetchEventSource源码中导出了两种类型的包cjs和esm。但是有个需求如何在原生是js中通过script标签引呢?需要加上type=module。今天介绍另一种方法 下载源码文件: https://github.com/Azure/fetch-event-source.git 安装: npm install --save-dev webpack webpack-cli ts

YOLOv8改进 | Conv篇 | YOLOv8引入DWR

1. DWR介绍 1.1  摘要:当前的许多工作直接采用多速率深度扩张卷积从一个输入特征图中同时捕获多尺度上下文信息,从而提高实时语义分割的特征提取效率。 然而,这种设计可能会因为结构和超参数的不合理而导致多尺度上下文信息的访问困难。 为了降低多尺度上下文信息的绘制难度,我们提出了一种高效的多尺度特征提取方法,将原始的单步方法分解为区域残差-语义残差两个步骤。 在该方法中,多速率深度扩张卷积

机器学习模型中的因果关系:引入单调约束

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。 碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。 这是有充分理由的。 事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。 在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、L

【scala 安装错误】错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner

错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 原因: Scala安装路径中包含空格。 解决办法:scala 不要安装在E:\Program Files 这种有空格的目录下,简直坑

C++11中新引入的enum类型

一、引言         在C++11中,引入了一个新的枚举类型——enum class(或称为作用域枚举类型),它相较于传统的enum类型有几个关键的不同点。enum class提供了更强的类型检查和封装,减少了命名冲突的可能性,并允许更加清晰地表达枚举的意图。 二、传统枚举(enum)的缺点         在C++11之前,枚举(enum)类型是隐式转换为整型的,这可能会导致一些意料之

springboot项目引入Sentinel熔断

本文是springboot项目+nacos进行引入,sentiel需自行按照部署 1.springboot包要是2.2.5或以上 <dubbo.version>2.7.7</dubbo.version><spring-boot.version>2.2.5.RELEASE</spring-boot.version><chainwork-boot.version>1.0.5-SNAPSHOT<

正确引入setupdesign和setupcompat的方式

正确引入setupdesign和setupcompat的方式 引入方式如下: ├── app│   ├── app.iml│   ├── assests│   ├── build│   ├── build.gradle // 配置1│   ├── libs│   ├── proguard-rules.pro│   └── src├── build.gradle├── TE