我遇到了 Infix
函数。尽量一个就是一天,下次找的时候方便。
有了这个函数就相当于自己定义了一种操作,跟自定义操作符差不多,但是又不一样,首先自定义操作符是那些特殊字符,比如 +
, -
和 *
等等。C++
里面有,只不过很久没看了也忘了。 kotlin
这个的命名规范跟变量一样,我自己简单的使用了一下,发现除了写法多了,其他的跟函数相同; Infix
必须满足以下要求:
- 必须是成员函数或扩展函数;
- 必须有且仅有一个参数;
- 参数必须不是可变参数(
vararg
修饰)和参数不能有默认值。
先看成员函数的例子
class Learn {
var learnDay = 0
infix fun test(learn: Learn): Learn {
this.learnDay += learn.learnDay
return this
}
fun bufu(learn: Learn): Learn {
this.learnDay = 0
return this
}
}
fun main() {
val learn1 = Learn()
learn1.learnDay = 2
val learn2 = Learn()
learn2.learnDay = 5
learn1 test learn2
// learn1 bufu learn2 这样会提示添加 infix 关键词
println(learn1.learnDay) // 7
}
除了直接调用 learn1 test learn2
,仍然可以像函数一样 learn1.test(learn2)
的方式调用;这里所谓的成员函数,也就是在类中的函数;下面看扩展函数:
fun main() {
infix fun Int.add(digit: Int): Int {
return this + digit
}
println(1 add 2) // 3
}
扩展函数有定义:
Kotlin provides an ability to extend a class with new functionality without having to inherit from the class or use design patterns such as Decorator. This is done via special declarations called extensions.
For example, you can write new functions for a class from a third-party library that you can't modify. Such functions are available for calling in the usual way as if they were methods of the original class. This mechanism is called extension functions. There are also extension properties that let you define new properties for existing classes.
大体的函数就是在不继承的情况下,也能动态的给类添加函数,比如我们像让 ArrayList
拥有找出第二大值的函数,但是呢默认 ArrayList
类并没有提供,怎么办, java
中的做法就是编写一个类,然后继承 ArrayList
这个类,然后再编写,想想就很麻烦,但是 kotlin
就很方便。扩展函数就有扩展属性,扩展属性跟扩展方法相似,但是今天说的这个不能修饰属性。没想到在学习的时候学到了新的东西,下次就记录扩展函数。
网友评论