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>…...
【.NET全栈】ASP.NET开发Web应用——用户控件和绘图
文章目录 前言一、用户控件1、创建用户控件2、使用用户控件3、在web.config中注册用户控件4、用户控件中公开属性5、用户控件事件6、动态加载用户控件 二、动态绘图1、基本绘图2、绘制一个自定义的图片3、在Web页面放置自定义图片4、图片格式和质量5、一个Web绘图示例程序 前言…...
一行Python代码实现数据清洗的18种方法
目录 1. 去除字符串两边空格 2. 转换数据类型 3. 大小写转换 4. 移除列表中的重复元素 5. 快速统计元素出现次数 6. 字符串分割成列表 7. 列表合并 8. 数据填充 9. 提取日期时间 10. 字符串替换 11. 快速排序 12. 提取数字 13. 空值处理(假设是列表&am…...
Java API练习 (1) (2024.7.20)
Date类 package APIExercise20240720; import java.util.Date; // 导包,Date是util下的 public class Date20240720 {public static void main(String[] args) {Date nowTime new Date(); // 得到当前系统时间System.out.println(nowTime);Date startTime new Da…...
JavaScript之WebAPIs-BOM
目录 BOM操作浏览器一、Window对象1.1 BOM(浏览器对象模型)1.2 定时器-延时函数1.3 js执行机制1.4 location对象1.5 navigator对象1.6 history对象 二、本地存储三、补充数组中的map方法数组中的join方法数组中的forEach方法(重点)数组中的filter方法(重…...
Math Reference Notes: 数学思想和方法
文章目录 1. 数学思想1.1 数形结合思想1.2 转化思想1.3 分类讨论思想1.4 整体思想 2. 数学方法2.1 配方法2.2 因式分解法2.3 待定系数法2.4 换元法2.5 构造法2.6 等积法2.7 反证法2.8 判别式法 1. 数学思想 1.1 数形结合思想 定义:将数与形(代数与几何…...
Spring Cloud GateWay(4.1.4)
介绍 该项目提供了一个建立在 Spring 生态系统之上的 API 网关,包括:Spring 6、Spring Boot 3 和 Project Reactor。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API,并为其提供跨领域关注点,例如:安…...
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHPMYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要…...
【微信小程序】wx.navigateTo传参时不能使用const定义的数据类型
2024年7月21日更新 今日调试时发现似乎是因为使用vant-weapp时按照官方提示关闭了style:"v2"导致的此情况,打开之后无法复现该内容,特此提示。 以下是原内容 如题,笔者测试了好久才找到这个bug,想传递的数据是this.d…...
【Android studio环境搭建】Android studio连接夜神模拟器
Android studio连接夜神模拟器 一、 步骤 1.下载好Android Studio和夜神模拟器, 2.打开夜神模拟器,找到其安装目录下的 nox_adb.exe文件 3.右键进入cmd命令打开,管理员权限执行下面命令 PS D:\Program Files\Nox\bin> .\nox_adb.exe connect 127.…...
Qt:26.Qt项目:贪吃蛇游戏
一、项目功能演示: 开始界面可以点击进入游戏。 点击进入游戏之后,切换到选项界面,该界面可以选择游戏难度,回退,以及查询最近一次游戏得分。 游戏具体界面如下。贴图啥的可以自己换,本人审美不咋行&#x…...
上海发布微博/谷歌seo服务
有个老师叫我和师姐参加他的项目,不知道能不能申请下来,如果申请下来,涉及到模型求解的那一块,是我和师姐的工作。他说是我们的强项,实际上我觉得我什么都不会,优化理论我都不懂,之前老师上课我…...
mvc 网站建设/小红书seo是什么
单页应用产出的入口chunk大小随着业务的复杂度线性增加,导致后期加载速度越来越慢。后面就需要对不同路径下的模块进行拆分,打包到相应的chunk下,按需加载,找到chunk的大小、个数和页面加载速度的平衡点。 解决办法 .vue模块文件按…...
合肥制作网站的公司简介/品牌建设
谷歌浏览器安装jetbrains ide support 打开webstorm 新建项目 新建test.html并添加js文件 Edit Configurations--->defaults-->javascript debug-->browser-->选择chrome 运行test.html 参考:https://blog.csdn.net/happybruce8023/article/details/534…...
如何用花生壳做网站/百度热搜榜今日头条排名
print的作用仅仅是将数据打印(输出)到你能看到的界面上 如下,我们将a和b的结果输出出来,我们就能看到运行的结果了 a 1 b hello print(a) print(b) return的主要作用是返回函数的一个计算结果如果直接这样说,听着肯…...
如何建立网站自己做站长/网站提交入口大全
软件测试是确保软件质量的可靠手段,是软件开发过程中必不可少的重要环节。本文提出了面向复用的测试用例设计过程,为测试用例复用提供了实现策略。测试用例的复用对于缩短软件开发周期和降低软件开发成本具有极其重要的意义。 1、引言 随着软件工程领域的…...
菏泽做网站/优化公司网站
使用root用户操作,报错误 rm: cannot remove ryukd.sh: Operation not permitted 1. chmod的底层实现是chattr命令,但是chattr命的功能更为强大,甚至可以锁定文件,即使root用户也操作不了此文件 2. chattr是用来更改文件属性&am…...