【Kotlin】运算符函数、解构函数、中缀函数

1 一元运算符

1.1 符号和函数

符号函数
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.dec()
a--a.inc()

1.2 案例

fun main() {var stu = Student("Tom", 13)println(-stu) // 打印: [moT, 31]
}class Student(var name: String, var age: Int) {operator fun unaryMinus(): Student {return Student(name.reversed(), age.toString().reversed().toInt())}override fun toString(): String {return "[$name, $age]"}
}

2 二元运算符

2.1 基础运算符

2.1.1 符号和函数

符号函数
a + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a..ba.rangeTo(b)
a..<ba.rangeUntil(b)
a in bb.contains(a)
a !in b!b.contains(a)

2.1.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)println(stu1 + stu2) // 打印: [TomMary, 31]
}class Student(var name: String, var age: Int) {operator fun plus(other: Student): Student {return Student(this.name + other.name, this.age + other.age)}override fun toString(): String {return "[$name, $age]"}
}

2.2 自增简化运算符

2.2.1 符号和函数

符号函数
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.remAssign(b)

        说明:如果类中同时定义了 plus 和 plusAssign 运算,a += b 就会产生歧义,因为 a += b 等价于 a = a + b,编译器不知道是执行 plus 函数还是 plusAssign 函数,就会编译报错,其他运算符同理。

2.2.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)stu1 += stu2println(stu1) // 打印: [TomMary, 31]
}class Student(var name: String, var age: Int) {operator fun plusAssign(other: Student): Unit {this.name += other.namethis.age += other.age}override fun toString(): String {return "[$name, $age]"}
}

2.3 比较运算符

2.3.1 符号和函数

符号函数
a > ba.compareTo(b)   > 0
a < ba.compareTo(b)   < 0
a >= ba.compareTo(b)   >= 0
a <= ba.compareTo(b)   <= 0

2.3.2 案例

fun main() {var stu1 = Student("Tom", 13)var stu2 = Student("Mary", 18)var res = stu1 >= stu2println(res) // 打印: false
}class Student(var name: String, var age: Int) {operator fun compareTo(other: Student): Int {return this.age - other.age}
}

3 括号运算符

3.1 小括号

3.1.1 符号和函数

符号函数
a()a.invoke()
a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, ..., i_n)a.invoke(i_1, ..., i_n)

3.1.2 案例

fun main() {var stu = Student("Mary", 18)stu() // 打印: Maryvar age = stu(1) // 打印: aprintln(age) // 打印: 18
}class Student(var name: String, var age: Int) {operator fun invoke(): Unit {println(name)}operator fun invoke(i: Int): Int {println(name[i])return age}
}

3.2 中括号

3.2.1 符号和函数

符号函数
a[i]a.get(i)
a[i, j]a.get(i, j)
a[i_1, ..., i_n]a.get(i_1, ..., i_n)
a[i] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, ..., i_n] = ba.set(i_1, ..., i_n, b)

3.2.2 案例

fun main() {var stu = Student("Mary")println(stu[1]) // 打印: astu[1] = 'W'println(stu.name) // 打印: MWry
}class Student(var name: String) {operator fun get(i: Int): Char {return name[i]}operator fun set(i: Int, c: Char): Unit {name = name.substring(0, i) + c + name.substring(i + 1)}
}

4 解构函数

4.1 解构属性

fun main() {var stu = Student("Tom", 13)var (name, age) = stuprintln("$name, $age") // 打印: Tom, 13var (_, age2) = stu // 只需要部分参数, 其他参数可以使用_忽略掉
}class Student(var name: String, var age: Int) {operator fun component1() = nameoperator fun component2() = age
}

4.2 解构在 Lambda 表达式中的使用

        Lambda 表达式详细介绍见 → Lambda表达式。

fun main() {var stu = Student("Tom", 13)var myFun: (Student) -> Unit = {(name, age) ->println("$name, $age")}myFun(stu) // 打印: Tom, 13
}class Student(var name: String, var age: Int) {operator fun component1() = nameoperator fun component2() = age
}

5 中缀函数

        中缀函数是使用 infix 关键字标记的函数,在使用时,可以省略点和括号,如:位运算 shl 就是一个中缀函数。函数必须满足以下条件。

  • 必须是成员函数(不是顶层函数);
  • 只能有一个参数;
  • 参数不能有默认值。

         中缀函数调用的优先级低于算术运算符、类型转换和 rangeTo 运算符,高于布尔运算符(&&、||、is)。

fun main() {var stu = Student("Tom")stu play "basketball"
}class Student(var name: String) {infix fun play(str: String): Unit {println("$name play $str")}fun test() {// play "badminton" // 编译报错this play "badminton"}
}

        说明: 如果在类中使用中缀函数,必须明确函数的调用方(接收器)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络工程师笔记14

VLAN原理与配置 VLAN 的功能 划分广播域&#xff0c;隔离广播域 VLAN的应用划分 VLAN配置命令

RTX4090上运行Cuda10.1报错:ValueError: Unknown CUDA arch (8.9) or GPU not supported

原因是cuda&#xff08;我这里是cuda10.1&#xff0c;改为支持7.5&#xff09;的版本不支持当前算力&#xff08;8.9&#xff09; 参考compute capability的官方表格:https://developer.nvidia.com/cuda-gpus 修改算力过程: sudo vim ~/.bashrc # 在配置文件中添加如下一行 exp…

微信怎么定时群发消息,一键群发5000好友?

对微信运营的人来说&#xff0c;群发是一件很有必要的事情&#xff0c;但是用微信群发的话&#xff0c;微信自带的群发助手只能发送文字和图片消息&#xff0c;一次只能选200个人&#xff0c;而且也无法定时群发&#xff0c;有很多不方便的地方&#xff0c;这个时候&#xff0c…

下一跳写法和出接口写法的使用

MA网络建议使用下一跳&#xff0c;点到点网络建议出接口 若在MA网络中所有出接口写法&#xff0c;编辑静态路由&#xff1b;为获取精确的下一跳MAC地址&#xff0c;路由器将使用代理ARP和ICMP重定向&#xff1b; 代理ARP&#xff1a;若一台路由器接收到非本接口直连网段地址的…

Python itertools.chain()

itertools.chain() 是 Python 内置模块 itertools 中的一个函数&#xff0c;用于将多个可迭代对象连接成一个可迭代对象。它的作用是将传入的多个可迭代对象按顺序连接起来&#xff0c;返回一个可迭代的链对象。 函数签名如下&#xff1a; itertools.chain(*iterables)参数说…

iptables在arm环境和x86环境对数据包的状态标识不一致?

问题&#xff1a; 有两条自定义iptables链&#xff0c;其中第一条链规则为当数据包状态为RELATED和ESTABLISHED状态时执行ACCEPT操作&#xff0c;另一条链为执行DROP操作。实现的目的是已经连接成功的数据包就直接放行&#xff0c;其他数据包一律阻断。 但是问题是在arm环境下…

简单的思考(一):MATLAB实现心形线

今天刷B站的时候看见了&#xff1a; 于是想着自己能不能也做出来 clc;clear; % 定义x的范围 x -2:0.01:2;% 初始化图形 figure; set(gcf,position,[0,0,800,600],color,w); h1 plot(x,abs(x).^(2/3) (0.9*sqrt((3.3-x.^2))).*sin(0.1*pi*x),r,LineWidth,3); hold on xlim(…

day01.蓝桥杯

1.哈希算法&#xff1a; #include <bits/stdc.h> using namespace std; const int MAXN1000001; int a[MAXN]; int main(){int n,m;while(~scanf("%d %d",&n,&m)){//输入m和n memset(a,0,sizeof(a));//将a数组初始化为0 for(int i0;i<n;i){int t;c…

数据结构:顺序表(C++实现)

1 头文件 SeqList.h //SeqList.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cassert> using namespace std; class SeqList { public://初始化SeqList();//销毁~SeqList();//头插void PushFront(int data);//头删void PopFront(…

Flutter 开发中踩坑笔记总汇

Flutter 踩坑笔记总汇 本篇主要是收集汇总开发过程中遇到的小困惑&#xff0c;都是些比较常见的问题。后续开发中遇到&#xff0c;也会持续更新在这里。 1、Flutter Packages upgrade后任务进入阻塞状态 问题&#xff1a;无法更新下载插件库。 解决&#xff1a;配置flutter官…

力扣(103、236、104)

103. 二叉树的锯齿形层序遍历 题目大意&#xff1a;将原先的层次遍历改为蛇形遍历&#xff0c;那么我们需要在102. 二叉树的层序遍历的基础上进行改进&#xff0c;首先蛇形走位&#xff08;先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层…

SQL注入攻击与防范:案例分析与最佳实践

SQL注入是一种常见的安全漏洞&#xff0c;攻击者利用此漏洞向应用程序的数据库发送恶意SQL查询&#xff0c;以执行未经授权的操作或获取敏感数据。以下是一些预防SQL注入的常见方法&#xff1a; 使用参数化查询&#xff1a;使用参数化查询可以有效防止SQL注入攻击。参数化查询将…

C语言几个比较实用的宏定义

最近同事远程调试设备&#xff0c;为了定位问题临时发布了好几个版本&#xff0c;有些版本号改了有些没改&#xff0c;结果调试完&#xff0c;准备备份版本的时候&#xff0c;忘了哪个版本是最新的了 这里介绍几个比较使用的宏&#xff0c;把编译时间加入到执行文件中&#xf…

k8s部署InfluxDB

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器&#xff0c;89b是容器ID的前三位 cd /usr/bin #进入容器后&#xff0c;进入此文件夹…

SEO是什么?网站为什么要做SEO?#川圣SEO#蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; SEO&#xff0c;即搜索引擎优化&#xff0c;是一种通过了解和利用搜索引擎的运作规则来提高网站在搜索结果中…

关于go中的select

笔记仓库&#xff1a;gitee.com/xiaoyinhui 代码中的解释纯个人理解&#xff0c;有不对的望指出 package testsimport ("fmt""testing" )var uCnt int 0func TestSelece(t *testing.T) {// 对于 select 语句&#xff0c;在进入该语句时&#xff0c;会按源…

Flink技术简介与入门实践

架构简介 Flink 是一个分布式流处理和批处理计算框架&#xff0c;具有高性能、容错性和灵活性。下面是 Flink 的架构概述&#xff1a; JobManager&#xff1a;JobManager 是 Flink 集群的主节点&#xff0c;负责接收和处理用户提交的作业。JobManager 的主要职责包括&#xff1…

即插即用卷积之TalkingHeadAttn

import torch from torch import nn""" 个代码实现了一个名为"TalkingHeadAttn"的自注意力模块(Self-Attention),主要用于增强神经网络在输入序列上的特征表示和建模。以下是这个自注意力模块的关键部分和特点:多头自注意力:这个模块使用了多头自…

Android13 客制化U盘挂载路径

Android 8.1 OTG U盘无法显示在系统文件管理的修改_mtk 屏蔽当贝市场u盘弹框-CSDN博客 Android 8.1 客制化OTG U盘的挂载路径名称_安卓8.1 u盘挂载目录-CSDN博客

Tomacat下载并且手动自动部署Web项目

Tomacat下载并且手动自动部署Web项目 Tomcat的简介Tomcat的作用Tomcat的下载Tomcat 部署1、环境准备2、手动部署项目3、自动部署项目&#xff08;IDEA&#xff09; ⭐ 前言 ⭐ 本篇文章主要介绍 Tomacat下载部署Web项目的详细使用以及部分理论知识 Tomcat的简介 Tomcat 服务…