Scala学习笔记19: 隐式转换和隐式参数
目录
- 第十九章 隐式转换和隐式参数
- 1- 隐式转换
- 1. 隐式准换函数: 施展魔法的咒语
- 2. 隐式类: 为已有类型添加魔法
- 3. 隐式转换规则: 魔法生效的条件
- 4. 举例说明: 见证魔法的时刻
- 5. 注意事项: 谨慎使用魔法
- 2. 隐式参数
- 1. 语义: 隐藏在背后的参数
- 2. 使用 隐式参数的方式
- 2.1 隐式值: 预先定义的助手
- 2.2 隐式参数列表: 按需传入
- 3. 优点: 简洁、灵活 、可扩展
- 4. 注意事项
- 5. 总结
- end
第十九章 隐式转换和隐式参数
隐式转换和隐式参数是 Scala 中两个强大的特性, 它们可以使代码更简洁、更灵活, 但也容易造成理解上的困难 ;
隐式转换 允许你自动将一种类型的对象转换成另一种类型的对象, 而无需显式调用转换方法 ;
例如, 你可以定义一个隐式转换, 将整数自动转换为字符串 ;
隐式参数 则允许你在函数定义中忽略某些参数, 编译器会在调用函数时自动查找并传入这些参数 ;
例如, 你可以定义一个隐式参数, 用于表示数据库连接, 并在需要访问数据库的函数中使用它 ;
总而言之, 隐式转换和隐式参数都可以帮助你简化代码, 提高代码的复用性 ; 但是, 过渡使用它们可能会使代码难以理解和调试 ;
因此, 在使用它们时需要谨慎, 并遵循一些最佳实践, 例如:
- 尽量将隐式隐式转换和隐式参数的定义放在伴生对象中, 以便于管理和查找 ;
- 使用清晰易懂的命名来定义隐式转换和隐式参数 ;
- 避免定义过于复杂的隐式转换和隐式参数, 以避免造成代码难以理解 ;
1- 隐式转换
Scala中的隐式转换就像魔术师手中的魔法棒, 可以在不改变代码结构的情况下, 悄无声息地将一种类型的值转换为另一种类型 ;
1. 隐式准换函数: 施展魔法的咒语
隐式转换函数式实现隐式转换的核心机制 ; 它们就像魔法咒语, 只要轻轻念动, 就能将目标悄悄改变 ;
要定义一个隐式转换函数, 你需要使用 implicit 关键字 :
implicit def intToString(x: Int): String = x.toString
2. 隐式类: 为已有类型添加魔法
隐式类是 Scala 2.10 版本引入的新特性, 它提供了一种更简洁的方式来扩展现有类型的功能 ;
implicit class RichInt(val value: Int) extends AnyVal {def times(n: => Int): Int = value * n}println(2 times 3) // Output: 6
上面的代码定义了一个名为 RichInt 的隐式类, 它为 Int 类型添加了一个 times 方法 ;
隐式类必须定义在其它类、对象或包中, 并且只能有一个参数 .
3. 隐式转换规则: 魔法生效的条件
Scala 编译器在以下情况下会尝试应用隐式转换:
- 当表达式类型与预期类型不匹配时 ;
- 当调用对象上不存在的方法时 ;
在寻找合适的隐式转换时, 编译器会遵循一定的规则:
- 首先查找当前作用域内的隐式转换 ;
- 如果没有找到, 则会查找伴生对象中的隐式转换 ;
- 最后, 还会查找导入的隐式转换 ;
4. 举例说明: 见证魔法的时刻
implicit class RichInt(val value: Int) extends AnyVal {def times(n: => Int): Int = value * n}def main(args: Array[String]): Unit = {// 隐式函数implicit def intToString(x: Int): String = x.toString// 隐式转换函数示例val num: Int = 10val str: String = num // 编译器会自动应用 intToString 函数进行转换println(str) // Output: 10// 隐式类val result: Int = 10.times(2) // 编译器会自动应用 RichInt 类的 times 方法进行转换println(result) // Output: 20}
5. 注意事项: 谨慎使用魔法
隐式转换虽然强大, 但也要谨慎使用 ; 过渡使用隐式转换会导致代码难以理解和维护 ;
- 尽量将隐式转换定义在伴生对象中, 并为其取一个清晰易懂的名称 ;
- 避免定义过于复杂的隐式转换 ;
总而言之, 隐式转换是 Scala 中一个强大而灵活的机制, 可以使代码更加简洁和易读 ; 但要切记, 谨慎使用 !
2. 隐式参数
Scala 隐式参数就像一双无形的助手, 它可以在无需显示传递参数的情况下, 默默地为函数提供所需的值 ;
1. 语义: 隐藏在背后的参数
在函数定义中, 使用 implicit 关键字标记的参数被称为 隐式参数 ;
当调用带有隐式参数的函数时, 如果未提供该参数, 编译器会尝试在当前作用域内查找一个类型匹配的隐式值, 并自动将其传入函数 ;
def greet(name: String)(implicit greeting: String): Unit = {println(s"$greeting, $name")}def main(args: Array[String]): Unit = {// 隐式参数greet("Jim")("Hello") // Output: Hello, Jim}
在上面的代码中, greeting 是一个隐式参数 ;
2. 使用 隐式参数的方式
2.1 隐式值: 预先定义的助手
可以通过定义一个 implicit val 来提供隐式值 :
def greet(name: String)(implicit greeting: String): Unit = {println(s"$greeting, $name")}def main(args: Array[String]): Unit = {implicit val defaultGreeting = "Hello"greet("Jim") // 等同于: greet("Jim")(defaultGreeting)// Output: Hello, Jim
编译器会自动使用 defaultGreeting 的值作为 greeting 参数 ;
2.2 隐式参数列表: 按需传入
可以在函数定义中添加一个隐式参数列表, 并在其中声明需要的隐式参数类型 :
def connect(implicit database: Database): Unit = {// 使用 database 链接数据库}
调用 connect 函数时, 编译器会在当前作用域内寻找类型为 Database 的隐式值 ;
3. 优点: 简洁、灵活 、可扩展
- 简化代码: 避免重复传递相同的参数 ;
- 提高灵活性: 可以在不同的上下文中使用不同的隐式值 ;
- 增强可扩展性: 可以轻松地添加新的隐式值, 而无需修改现有代码 ;
4. 注意事项
- 作用域要清晰: 隐式参数的查找范围有限, 确保其在作用域内可见 ;
- 避免歧义: 避免定义多个类型相同的隐式值, 导致编译器无法确定使用哪个 ;
- 谨慎使用: 过度使用隐式参数会降低代码的可读性和可维护性 ;
5. 总结
Scala 隐式参数是一项强大的功能, 可以使代码更简洁、更灵活, 但也需要谨慎使用 ;
理解其工作原理和最佳实践, 才能更好地驾驭它 .
end
相关文章:
Scala学习笔记19: 隐式转换和隐式参数
目录 第十九章 隐式转换和隐式参数1- 隐式转换1. 隐式准换函数: 施展魔法的咒语2. 隐式类: 为已有类型添加魔法3. 隐式转换规则: 魔法生效的条件4. 举例说明: 见证魔法的时刻5. 注意事项: 谨慎使用魔法 2. 隐式参数1. 语义: 隐藏在背后的参数2. 使用 隐式参数的方式2.1 隐式值:…...
用户登录安全是如何保证的?如何保证用户账号、密码安全?
1.HTTP协议直接传输密码(无加密) 前端 直接发送HTTP请求(无加密),攻击者可直接捕获网络包,看到下面的明文信息 因此,使用HTTP协议传输会直接暴露用户敏感信息。 2.HTTPS协议直接传输密码&…...
Java 写一个可以持续发送消息的socket服务端
前言 最近在学习flink, 为了模仿一个持续的无界的数据源, 所以需要一个可以持续发送消息的socket服务端. 先上效果图 效果图 socket服务端可以持续的发送消息, flink端是一个统计单词出现总数的消费端,效果图如下 源代码 flink的消费端就不展示了, 需要引入一些依赖和版本…...
Ubuntu2204搭建ceph17
Ceph 环境初始化搭建Ceph 本次实验基于VMware17 节点IPstorage01192.168.200.161storage01192.168.200.162storage01192.168.200.163 环境初始化 初始化基础环境,三节点执行 #!/bin/bash# 定义节点信息 NODES("192.168.200.161 storage01 root" "…...
Druid 面试题及答案整理,最新面试题
Druid连接池在项目中有哪些优势? 1、高性能: Druid连接池在性能方面进行了大量优化,可以快速回收和分配数据库连接,减少数据库访问延迟。 2、实时监控: 提供Druid Monitor监控功能,可以实时监控数据库访问性能和连接池状态,便于及时发现和解决问题。 3、扩展性强: 支持…...
数据库基础与安装MYSQL数据库
一、数据库管理系统DBMS 数据库技术是计算机科学的核心技术之一,具有完备的理论基础。使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据 1.可以结构化存储大量的数据信息,方便用户进行有效的检索和访问 2.可以…...
昇思25天学习打卡营第18天| DCGAN生成漫画头像
DCGAN,全称深度卷积对抗生成网络(Deep Convolutional Generative Adversarial Networks),是一种通过对抗训练生成图像的技术。它在判别器和生成器中都使用了卷积和转置卷积层。 训练分为两个部分:训练判别器和训练生成…...
【面试八股文】计算机操作系统
参考:大佬图解文章 → 小林coding 简介:之前在学习小林大佬的八股文时,摘录了一些个人认为比较重要的内容,方便后续自己复习。【持续更新ing ~💯】 注:加五角星标注的,是当前掌握不牢固的&…...
宝塔Wordpress 插件 Redis object cache 导致内存很高 80%以上的原因和解决
查看内存前X 使用以下命令查看前10,修改10数字即可查看前X ps aux | head -1;ps aux |grep -v PID |sort -rn -k 4 | head -10 查看cpu占用 查看前10 ps aux | head -1;ps aux |grep -v PID |sort -rn -k 3 | head -10 原因是 4GiB 内存的服务器,Redis会…...
node解析Excel中的考试题并实现在线做题功能
1、背景 最近公司安排业务技能考试,下发excel文件的题库,在excel里查看并不是很方便,就想着像学习驾考题目一样,一边看一边做,做完之后可以查看正确答案。 2、开始分析需求 题目格式如下图 需求比较简单,…...
怎么降低美国服务器硬盘故障率?
要降低硬盘故障率,首先需要了解其产生的原因,常见的美国服务器硬盘故障原因包括温度过高、振动过大、电流不稳定、质量问题等。对于美国服务器而言,由于其运行环境可能存在差异,如温湿度变化大、电力供应不稳定等,这些…...
Java---后端事务管理
代码世界聚眸光,昼夜敲盘思绪长。 算法心间精构建,编程路上细思量。 屏前架构乾坤定,键上飞驰智慧扬。 默默耕耘成果现,创新科技铸辉煌。 目录 一,概念 二,Spring事务管理 三,rollbackFor事务回…...
Leetcode 3223. Minimum Length of String After Operations
Leetcode 3223. Minimum Length of String After Operations 1. 解题思路2. 代码实现 题目链接:3223. Minimum Length of String After Operations 1. 解题思路 这一题还是比较简单的,其实就是想明白对于任何一个字符,如果其个数在3个或以…...
oops使用笔记
oops-plugin-excel-to-json 使用 gitee上的文档图片不可见 参考 > https://forum.cocos.org/t/topic/156800 配置,打开“项目设置”,拖动到最下面,有一个"Excel to Json",前3项采用默认配置吧Excel, 默认的Excel目录是与assets平级的excel目…...
redistemplate介绍与演示
redistemplate是一个用于在Redis中存储和检索数据的模板库。它提供了一组简单易用的函数和接口,使开发者能够更方便地使用Redis进行数据操作。 使用redistemplate,你可以实现以下功能: 存储和检索数据:redistemplate提供了存储和…...
代谢组数据分析(十五):基于python语言构建PLS-DA算法构建分类模型
介绍 本教程描述了一个具有二元分类结果的研究的典型代谢组学数据分析工作流程。主要步骤包括: 从Excel表格导入代谢物和实验数据。基于汇总QC的数据清洗。利用主成分分析可视化来检查数据质量。两类单变量统计。使用偏最小二乘判别分析(PLS-DA)进行多变量分析,包括: 模型…...
任务3 git基础知识(主要是pr的笔记)
任务要求 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Git/task.md 文档 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Git/readme.md 任务 任务1:提交PR https://github.com/InternLM/Tutorial/pull/1242 任务2:实践…...
三相PWM整流器滞环电流控制仿真matlab simulink
1、内容简介 略 88-可以交流、咨询、答疑 2、内容说明 略 三相PWM整流器已广泛应用工业与电气控制领域电流控制技术决定着三相PWM整流器系统的控制性能。综合比 较了各种电流控制方法应用较多的滞环比较…...
AVL树超详解上
前言 学习过了二叉树以及二叉搜索树后(不了解二叉搜索树的朋友可以先看看这篇博客,二叉搜索树详解-CSDN博客),我们在一般情况下对于二叉搜索树的插入与查询时间复杂度都是O(lgN),是十分快的,但是在一些特殊…...
spring boot 实现token验证登陆状态
1、添加maven依赖到pom.xml <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId>…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
