Kotlin作用域函数it和with的使用场景

在 Kotlin 中,applyrunwith 使用 this,而 letalso 使用 it,这背后的原因是为了提供灵活性和代码清晰度。不同的作用域函数有不同的设计目的,选择使用 thisit 是为了适应不同的使用场景。以下是详细解释:

使用 this 的作用域函数

apply
  • 设计目的:主要用于配置对象。
  • 使用 this 的原因:使用 this 可以直接访问和修改对象的属性和方法,而无需显式地引用对象名称。适用于在对象初始化或配置时,设置多个属性。
val person = Person().apply {
    name = "John"
    age = 30
    // 直接使用 this 引用当前对象
}
run
  • 设计目的:用于在对象上下文中执行代码块并返回代码块的结果。
  • 使用 this 的原因this 提供了对对象的直接访问,适合在对象上下文中执行一些操作并返回结果。
val greeting = person.run {
    "Hello, my name is $name and I am $age years old."
    // 直接使用 this 引用当前对象
}
with
  • 设计目的:用于在对象上下文中执行代码块并返回代码块的结果。
  • 使用 this 的原因:与 run 类似,this 提供了对对象的直接访问,适合对对象执行一系列操作。
val description = with(person) {
    "Name: $name, Age: $age"
    // 直接使用 this 引用当前对象
}

使用 it 的作用域函数

let
  • 设计目的:用于对非空对象执行代码块,并返回代码块的结果。常用于可空类型的处理和链式调用。
  • 使用 it 的原因let 的主要作用是将对象作为参数传递给代码块,在代码块中使用 it 引用当前对象,避免命名冲突和代码重复。
val result = someObject?.let {
    println(it)
    it.toString()
    // 使用 it 引用当前对象
}
also
  • 设计目的:用于对对象执行附加操作,并返回该对象本身。常用于调试或记录日志。
  • 使用 it 的原因also 的设计目的是在不改变对象本身的情况下执行附加操作。使用 it 可以避免与外部作用域中的 this 混淆,保持代码简洁。
val person = Person("John", 25).also {
    println("Name before: ${it.name}")
    it.name = "Alice"
    // 使用 it 引用当前对象
}

设计背后的原因

  1. 代码清晰度

    • 使用 this 可以直接访问对象的属性和方法,适合在配置对象时使用,代码更简洁。
    • 使用 it 可以避免命名冲突,适合在链式调用或附加操作时使用。
  2. 灵活性

    • 通过提供不同的作用域函数,Kotlin 允许开发者选择最适合当前场景的方式来处理对象。
    • 使用 thisit 提供了不同的上下文,满足不同的代码需求。
  3. 一致性

    • Kotlin 的作用域函数遵循一致的设计模式,使得开发者可以直观地理解每个函数的用途和使用方式。

示例对比

以下是一个对比示例,展示 applylet 的不同使用场景:

data class Person(var name: String, var age: Int)

fun main() {
    // 使用 apply 配置对象
    val person = Person("John", 25).apply {
        name = "Alice"
        age = 30
        // 使用 this 直接访问和修改属性
    }
    println(person)

    // 使用 let 处理可空类型
    val name: String? = "Kotlin"
    name?.let {
        println("The name is $it")
        // 使用 it 引用当前对象,避免命名冲突
    }
}

通过这些示例和解释,可以看出 Kotlin 在设计作用域函数时,有明确的目的和使用场景,以便提供灵活且清晰的代码编写方式。
关于我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.linux操作系统CPU使用率和平均负载区别

目录 概述cpu使用率区别 结束 概述 linux操作系统CPU 使用率 和 平均负载 区别 负载高并不一定使用率高,有可能 cpu 被占用,但不干活。 cpu使用率 cpu使用率:cpu非空闲态运行的时间占比,反映cpu的繁忙程度,和平均负载…

大模型上下文长度扩展中的检索增强技术简述

基于Transformer的语言模型在众多自然语言处理任务上都取得了十分优异的成绩,在一些任务上已经达到SOTA的效果。但是,经过预训练后,模型能够较好处理的序列长度就固定下来。而当前的众多场景往往需要处理很长的上下文(如&#xff…

如何安装多版本CUDA?

在这篇文章中,我们不仅要安装好CUDA,还有安装多版本的CUDA 首先聊一个题外话:前几天在csdn上看到的一个话题”安装pytorch一定要去nvidia官网下载安装cuda和cudnn吗?“ 我相信任何一个刚开始接触或者从事深度学习的炼丹者都会从安…

java中break和continue的标签使用

break标签的使用 break label是退出label对应的循环 //BreakDetail.java //2024.06.29 public class BreakDetail{public static void main(String[] args) {label1:for(int j 0; j < 4; j){label2:for(int i 0; i < 10; i){if(i 2){//break; //情况1//break label2…

五、Pentium 微处理器保护模式存储管理,《微机系统》第一版,赵宏伟

一、分段存储管理 Pentium支持分段存储管理、分页存储管理和段页式存储管理。 1.1 分段存储管理的基本思想 一个程序由多个模块组成。 每一个模块都是一个特定功能的独立的程序段。 段式管理&#xff1a;把主存按段分配的存储管理方式。 程序模块→段→段描述符→段描述符…

热题系列章节7

剑指 Offer 04. 二维数组中的查找 题目描述&#xff1a; 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数…

Chrome浏览器web调试(js调试、css调试、篡改前置)

目录 1. 打开开发者工具(Dev Tool) 2. 打开命令菜单 截图 3. 面板介绍 4. CSS调试 右键检查快速到达元素处 查找DOM数 利用面板Console查找DOM节点 内置函数查找上一个选择点击的元素 5. 调试JS代码(Javascript调试) 日志调试 选择查看日志等级 眼睛观测变量 …

创新前沿:Web3如何颠覆传统计算机模式

随着Web3技术的快速发展&#xff0c;传统的计算机模式正面临着前所未有的挑战和改变。本文将深入探讨Web3技术的定义、原理以及它如何颠覆传统计算机模式&#xff0c;以及对全球科技发展的潜在影响。 1. 引言&#xff1a;Web3技术的兴起与背景 Web3不仅仅是技术创新的一种&…

可编程定时计数器8253/8254 - 8253入门

时钟-给设备打拍子 概述 在计算机系统中&#xff0c;为了使所有设备之间的通信井然有序&#xff0c;各通信设备间必须有统一的节奏&#xff0c;不能各干各的&#xff0c;这个节奏就被称为定时或时钟 时钟并不是计算机处理速度的衡量&#xff0c;而是一种使设备间相互配合而避…

2024 Parallels Desktop for Mac 功能介绍

Parallels Desktop的简介 Parallels Desktop是一款由Parallels公司开发的桌面虚拟化软件&#xff0c;它允许用户在Mac上运行Windows和其他操作系统。通过强大的技术支持&#xff0c;用户无需重新启动电脑即可在Mac上运行Windows应用程序&#xff0c;实现了真正的无缝切换。 二…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络&#xff08;FCN&#xff09; 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…

Class Constructors and Destructors (类的构造函数和析构函数)

Class Constructors and Destructors [类的构造函数和析构函数] 1. Declaring and Defining Constructors (声明和定义构造函数)2. Using Constructors (使用构造函数)3. Default Constructors (默认构造函数)4. Destructors (析构函数)5. Improving the Stock Class (改进 Sto…

香港回归庆典开序幕,蝴蝶效应集团齐献礼

6月29日,香港各界庆典委员会庆祝香港回归祖国27周年活动启动礼在维多利亚公园举行。香港特区行政长官李家超、中央政府驻港联络办主任郑雁雄、香港各界庆典委员会主席谭锦球和筹委会主席陈鸿道等出席并致辞。 作为香港物流行业推广的领军企业,香港蝴蝶效应集团也以优秀企业代表…

Go 语言切片遍历地址会发生改变吗?

引言&#xff1a;今天面试的时候&#xff0c;面试官问了一道学 Go 语言的同学都会的简单代码&#xff0c;是关于 Go 语言 for 循环问题的&#xff0c;他询问了一个点&#xff0c;循环中共享变量的地址会发生改变吗&#xff1f; 相信听到这个问题的你&#xff0c;第一反应肯定是…

分享屏幕坐标和窗口通信

简介 实现功能&#xff0c;通过url传参选择扑克牌&#xff0c;桌面同时打开两个以上该窗口&#xff0c;扑克牌可以在窗口之间移动。 在线演示 屏幕坐标和窗口通信 实现代码 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" co…

Linux_动、静态库

目录 一、静态库 1、静态库的概念 2、制作静态库的指令 3、制作静态库 4、链接静态库 二、动态库 1、动态库的概念 2、制作动态库的指令 3、制作动态库 4、链接动态库 5、动态库的加载 三、静态库与动态库的区别 结语 前言&#xff1a; 在Linux下大部分程序进…

学习笔记——动态路由——OSPF(报头信息、报文信息、三张表)

六、OSPF协议的报头信息、报文信息、三张表 OSPF的协议报文在一个广播域内进行传递&#xff0c;是直接封装在IP报文中的&#xff0c;协议号为89。 OSPF本身5种类型&#xff1a;分别是Hello报文、DD报文、LSR报文、LSU报文、LSAck报文&#xff0c;各种不同类型的LSA其实只是包含…

Jedis、Lettuce、RedisTemplate连接中间件

jedis就像jdbc一样&#xff0c;用于两个端直接的连接。 1.创建Spring项目 这里不过多赘述... 2.导入连接工具jedis 在pom文件中导入jedis的依赖。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…

第一周:李宏毅机器学习笔记

第一周学习周报 摘要一、机器学习基础理论1. 什么是机器学习&#xff1f;2. 机器学习“寻找”的函数有哪些类型&#xff1f;3. 机器学习中机器如何“寻找”函数&#xff1f;三步走3.1 第一步&#xff1a;设定函数的未知量&#xff08;Function with Unknown Parameters&#xf…

昇思25天学习打卡营第12天|ShuffleNet图像分类

1. 学习内容复盘 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&a…