隐式值详解|学习笔记

简介: 快速学习隐式值详解。

开发者学堂课程【Scala 核心编程-基础:隐式值详解】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/9009


隐式值详解

 

内容介绍

基本介绍

应用案例

课堂测试题

 

一、基本介绍

隐式值也叫隐式变量,将某个形参变量标记为 implicit,所以编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺省参数scala 中的默认值默认值只能作用在一个函数的一个形参上但是隐式值可以作用在多个函数的形参上它的范围更加广泛

 

二、应用案例

implicit val str1: String = "jack"

def hello(implicit name: String): Unit = {隐式参数

println(name + " hello")

hello //调用.不带()

//[案例演示+反编译]

1、创建 ImplicitValDemo03选择 object

package com. atguigu. chapter09

object ImplicitValDemo03 {

Def main(args: Array[String]): Unit = {

implicit val str1: String = "jack"//这个就是隐式值implicit 修饰 str1变量

//implicit name: Stringname 就是隐式参数

def hello(implicit name: String): Unit = {  

println(name + " hello")

}

Hello//底层 hello‘’jack‘’

}

}

这时 name 会将 jack 自动传进去

运行结果如下

Jack hello

2、打开底层实现,ImplicitValDemo03$.class。

package com. atguigu. chapter09;

import scala.Predef.;

public final class Implici tValDemo03$

{

public static final MODULE$;

Static

{

new () ;

}

pub1ic void main (String[] args)

{

String str1 = "jack~";

hello$1 (str1) ;  采用第一种方式

}

private final void hello$1 (String name )

{

Predef. . MODULE$. println (new StringBuilder () . append (name) .append(" hello") . toString());

}

private ImplicitValDemo03$ ()

{

MODULE$ . this;

}

}

Hello//底层hello$1 (str1)

 

三、课堂测试题

1、下面的代码是正确,并解释 scala 底层实现机制底层的函数名

object ImplicitVal {

def main(args: Array[String]): Unit = { 主函数

implicit val str1: String = "jack"//隐式值

def hello(implicit name: String): Unit = ({//底层生成 hello$1

println(name + " hello")

def hello(): Unit = {//生成hello$2

println("xxxx")

}

}

hello //hello$1 (str1)  使用隐式值不要带()写了会报错如果明确写()意图就是调用hello不传任何参数语法错误

}

def hello(): Unit = ( //函数名 hello

println("xx") }

}

2、看下面几个案例,判断是否正确

(1)创建 ImplicitVal02选择 object

object ImplicitVal02 {

def main(args: Array[String]): Unit= {

//隐式变量(值)

implicit val name: String = "Scala"

//implicit val name1: String = "World"

//隐式参数

def hello(implicit content: String = "jack"): Unit= {

println("Hello " + content)

} //调用 hello

Hello  

}

}

运行会报错提示模糊不确定因为编译器只能匹配一个所以把其中一个注销

第一题是错误的编译器会报错再次证明隐式具有一致性不能有二义性

(2)object Scala03 {

def main(args: Array[String]) : Unit = {

//隐式变量(值)

implicit val name : String = "Scala"

//当同时有 implicit 值和默认值implicit 优先级高

def hello2( implicit content : String = "okook" ) : Unit = {

println("Hello2" + content)

}

//调用 hello  

Hello2

}

}

输出什么内容?

implicit 直接在编译器写进去所以级别要比默认高

输出 hello2 scala

(3)object Scala03 {

def main(args: Array[String]) : Unit = {

//隐式变量(值)

//说明

//1.当一个隐式参数匹配不到隐式值,仍然会使用默认值

implicit val name : Int = 10

def hello3( implicit content : String = "jack" ) : Unit = {

println("Hello3" + content )

}  

//调用 hello  

Hello3// hello3 jack

}

}

输出什么内容?

输出 hello jack

虽然标记成隐式参数但是在没有匹配到隐式值时仍然会去使用默认值并不会报错

(4)object Scala03 {

def main(args: Array[String]) : Uni t = {

//隐式变量(值)

implicit val name:Int=10

//当没有隐式值没有默认值又没有传值就会报错

def hello4( implicit content : String ) : Uni t = { 隐式参数

println(" Hello4" + content )

}  

//调用 hello

hello 4

}

输出什么?

会报错

把默认值去掉首先找隐式值会找到是int型默认值没有给不传值所以匹配不到比如有隐式值默认值传值优先传值当三者都有指定优先级最高的传值隐式值默认值如果都匹配不到就报错

目前是又没有传参数又没有隐式值又没有默认值所以一定会报错会在36行抛出一个错误执行查看提示36行有错误

//小结

//1.当在程序中, 同时有隐式值,默认值,传值

//2.编译器的优先级为传值>隐式值>默认值

//3.在隐式值匹配时,不能有二义性

//4.如果三个(隐式值,默认值,传值)一个都没有,就会报错

隐式值的案例是快速入门的案例

一个案例说明隐式值默认值传值的优先级问题

相关文章
|
SQL 缓存 网络协议
有哪些常见的网络攻击类型?
【8月更文挑战第15天】
781 0
|
11月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
263 24
|
10月前
|
存储 移动开发 JavaScript
网页 HTML 自动播放下一首音乐
在 HTML5 中实现自动播放下一首音乐,通过管理音乐列表、操作音频元素和监听事件完成。创建包含多个音乐链接的列表,使用 `<audio>` 元素加载音乐,监听 `ended` 事件,在当前音乐结束时自动播放下一首。示例代码展示了如何使用 JavaScript 实现这一功能,确保无缝切换音乐。
|
11月前
|
存储 NoSQL Java
流计算需要框架吗?SPL 可能是更好的选择
流数据源的动态无界特性使得传统数据库技术难以直接处理,而Heron、Samza、Storm、Spark、Flink等计算框架在流计算领域取得了先发优势。然而,这些框架往往侧重于访问能力,计算能力不足,尤其在高级计算如流批混算、复杂计算和高性能计算方面表现欠佳。esProc SPL作为基于JVM的轻量级开源计算类库,专注于提升流计算的计算能力,支持丰富的流数据访问、灵活的集成接口和高效的内外存存储格式,具备强大的高级计算功能,能够简化业务逻辑开发并适应多样的应用场景。SPL通过专业的计算语言和结构化数据处理能力,为流计算提供了更优的解决方案。
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
存储 人工智能 关系型数据库
PolarDB 与 AI/ML 集成的应用案例
【8月更文第27天】随着大数据和人工智能技术的发展,越来越多的企业开始探索将关系型数据库与 AI/ML 技术相结合的方式,以提高数据分析效率和业务智能化水平。阿里云的 PolarDB 是一款高性能的关系型数据库服务,支持多种数据库引擎,如 MySQL、PostgreSQL 和 Oracle。通过与阿里云的其他 AI/ML 服务集成,PolarDB 能够为企业提供端到端的数据处理和分析解决方案。
489 0
|
机器学习/深度学习 运维 算法
流计算中的流式机器学习是什么?请解释其作用和常用算法。
流计算中的流式机器学习是什么?请解释其作用和常用算法。
352 0
|
存储 机器学习/深度学习 运维
提升数据中心能效:现代运维策略与实践
【5月更文挑战第6天】 在数字化时代,数据中心作为信息处理的核心设施,其能源消耗和环境影响成为业界关注的焦点。本文将探讨如何通过现代运维策略和技术手段提升数据中心的能效,同时保证系统的可靠性和服务的连续性。文章将详细分析数据中心能耗的主要来源,介绍先进的能效优化措施,并通过案例分析展示这些措施的实际效果,为数据中心管理者提供实用的能效改进建议。
|
存储 Shell 数据安全/隐私保护
ZooKeeper【基础 04】控制权限ACL(原生的 Shell 命令)
ZooKeeper【基础 04】控制权限ACL(原生的 Shell 命令)
492 0