约定

  在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. python Tkinter 组件

    Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用.这些控件通常被称为控件或者部件. 目前有15种Tkinter的部件.我们提出这些部件以及一个简短的介绍,在下面的表: 控件 ...

  2. 微信点餐系统(七)-微信授权获取openid:

    章节小结: 1.学会了微信授权的步骤,学会了微信授权的文档 2.学会了使用natapp内网穿透工具 3.加深了虚拟机的网络配置以及基本使用 4.学会了抓包购票工具fiddler的使用 5.微信授权步骤 ...

  3. 文件操作:fread()和fwrite()

    fread和fwrite函数功能     用来读写一个数据块.   一般调用形式     fread(buffer,size,count,fp);     fwrite(buffer,size,cou ...

  4. 将Emacs Org mode用于GTD任务管理

    在上一篇日志中,我简要介绍了如何围绕Emacs Org mode构建个人任务管理系统的基本思路与方法.因为Org mode体系庞大.功能繁杂,本文仅以提纲契领的方式介绍不同环节在Org mode中的操 ...

  5. ELK+Filebeat+redis整合

    前面的博客,有具体的ELK安装配置步骤,此处在其基础上修改 修改配置文件并启动 [root@topcheer filebeat-6.2.3-linux-x86_64]# vim filebeat.ym ...

  6. 关于Fibonacci博弈的一些学习

    关于Fibonacci博弈的一些学习 一道例题 问题 给定n(n≥2)个石头,游戏双方轮流取至少一个石子,取到最后一个石子的人算赢,但是要满足一下规则: 第一次取不能全部取完所有的石子. 设前一次取的 ...

  7. HDU 6012 Lotus and Horticulture(离散化)

    题目代号:HDU 6012 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6012 Lotus and Horticulture Time Limit: ...

  8. 3D Computer Grapihcs Using OpenGL - 20 结合Buffer

    在上一节的案例中,我们使用了四个Buffer Object,立方体的VertexBuffer,立方体的索引Buffer,四面体的VertexBuffer,四面体的索引Buffer. 我们这节尝试把两个 ...

  9. JS深度判断两个数组对象字段相同

    /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype.toSt ...

  10. springboot切换配置

    1.默认只有一个application.properties文件 1)删除properties文件,换成yml方式.新增dev,prod两个文件 2)配置application.yml文件:actio ...