约定

  在Kotlin中,可以调用自己代码中定义的函数,来实现语言结构。这戏功能与特定的函数命名相关,例如,在你的类中定义了一个名为plus的特殊方法,那么按照约定,就可以在该类的实例上使用 + 运算符,因此,我们把这种技术称为“约定”。


重载运算符

/*
*这里给一个类添加了plus方法来重载 + 运算符
*/
data point(val X:Int,val Y:Int){
//operator修饰符是声明这个方法是用来重载的
operator fun plus(other:point): point {
return point(this.X+other.X,this.Y+other.Y)
}
}
//重载之后,point对象就可以直接使用+运算符来操作两个对象了
fun main(args: Array<String>) {
val a= point(,)
val b= point(,)
println(a+b)
}

可重载的二元运算符

表达式 函数名
a * b times
a / b div
a % b mod
a + b plus
a - b minus

  如果重载 + 或 * 计算的两边类型不同的话,那么不支持交换性,需要额外定义一个函数。

可重载的一元运算符

表达式 函数名
+a unaryPlus
-a unaryMinus
!a not
++a,a++ inc
--a,a-- dec

可重载的比较运算符

   equals和compareTo


集合与区间的约定

  通过下标来访问元素:“get“和”set“

//这里使用了扩展函数实现get约定
operator fun point.get(index : int): Int{
return when(index){
0 -> x
1 -> y
else ->
throw IndexOutOfBoundsException("Invalid coordinate $ index")
}
} //重载set
operator fun point.set(index : int,value : Int): Int{
return when(index){
0 -> x = value //根据对应的index来修改值
1 -> y = value
else ->
throw IndexOutOfBoundsException("Invalid coordinate $ index")
}
} >>>val p=point(10,20)
>>>println(p[1])
20

  in的约定,相对应的函数叫做contains

//使用in来检查点是否在矩形区域内
data class Rectangle(val upperLeft:point, val lowerRight:point) operator fun Rectangle.contains(p:point):Boolean{
//until构建了一个开区间
return p.x in upperLeft.x until lowerRight.x &&
p.y in upperLeft.y until lowerRight.y
}

//rangeTo的约定  1..10
operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T> //在for循环中使用iterator的约定,这让迭代字符串成为可能
operator fun CharSequence.iterator(): CharIterator >>>for (c in "abc")

解构声明和组件函数

  解构声明允许展开单个复合值,并使用它来初始化多个单独的变量

>>>val p = point(10, 20)
>>>val (x,y) = p
>>>println(x)
10
>>>printlb(y)
20

  对于数据类,编译器为每个在主构造方法中声明的属性生成一个componentN函数,下面展示如何手动为非数据类声明这些功能:、

//结构声明,可以在调用函数后轻松的展开一个对象,使用它的值
class point(val x: Int, val y: Int){
operator fun component1() = x
operator fun component2() = y
}

  此外,还可以用解构声明来遍历map for((key, value) in map){ println("$key -> $value") }


委托属性(不全)

//使用委托来实现懒汉式初始化(不调用不赋值,调用时才初始化)
fun loadEmails():Int{
println("Load emails")
return 1
} class Person(val name:String){
val emails by lazy{ loadEmails() }
} >>>println(Person().emails)
Load emails
1

   

kotlin学习(6)运算符重载和其他约定的更多相关文章

  1. C++学习之运算符重载的总结

    C++学习之运算符重载的总结              运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...

  2. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

  3. C++学习26 运算符重载的概念和语法

    所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...

  4. C++学习笔记-运算符重载

    运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...

  5. STL学习之运算符(<<)重载问题和仿函数的实现

    /*   运算符<<的重载一直报错,   友原函数中可以访问到类的私有成员*/#include<iostream>using namespace std; class MyIn ...

  6. 运算符重载+日期类Date

    Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...

  7. C++学习笔记之运算符重载

    一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标 ...

  8. 初步C++运算符重载学习笔记&lt;3&gt; 增量递减运算符重载

    初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数     增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...

  9. 初探C++运算符重载学习笔记&lt;2&gt; 重载为友元函数

    初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...

随机推荐

  1. luogu P1063 能量项链 x

    P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...

  2. jQuery_完成表格的隔行换色

    表格的颜色一样不利于区分,而利用jQuery则可以很方便的进行表格的隔行换色操作,原表如下: 这样看着很不方便,但是隔行换色之后非常便捷清楚. 代码如下: <!DOCTYPE html> ...

  3. vim编辑器快捷键

    光标控制命令 命令 光标移动 h或^h 向左移一个字符 j或^j或^n 向下移一行 k或^p 向上移一行 l或空格 向右移一个字符 G 移到文件的最后一行 nG 移到文件的第n行 w 移到下一个字的开 ...

  4. Linux shell - 除法保留小数点

    我想实现 举例:1/3=0.33得到0.33, 尝试过bc 只能得到.33,没有0了, linux 下的shell脚本,1和3是变量$a和$b,并能指定小数点后的位数, 方法1: $> res= ...

  5. Failed to read artifact descriptor for xxx:jar

    在MyEclipse中执行Maven的install命令时,报“Failed to read artifact descriptor for xxx:jar ”的错误.这可能是在下载过程中文件出现错误 ...

  6. MongoDB通过JavaDriver执行shell命令,例如创建sharding collection

    Mongodb的java driver本身的接口 void createCollection(String collectionName, CreateCollectionOptions create ...

  7. 多层全连接神经网络实现minist手写数字分类

    import torch import numpy as np import torch.nn as nn from torch.autograd import Variable import tor ...

  8. 关于Anaconda的虚拟环境操作

    # 1.创建虚拟环境 conda create -n env_name python==版本号 # 2.激活虚拟环境 conda activate env_name # 3.下载相关模块 pip in ...

  9. Centos 7 Redmine 安装,粘贴图片插件安装

    转自: https://blog.csdn.net/jctian000/article/details/80591878 Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.它用日历和甘 ...

  10. sh脚本获取当前目录

    #!/bin/bashcurDir=$(pwd)echo "cur dir is:$curDir"