扩展功能->委托

时间:2020-07-18 22:17:09

标签: kotlin

我是编程新手,目前正在学习如何在Kotlin编程的课程。我目前正在学习的课程有问题。

我真的很难解决这种问题。我发现很难概念化问题所在。我不知道从哪里开始,我也不知道要搜索什么。一遍又一遍地阅读扩展功能理论并不能真正帮助我理解问题所在。

所以这是下面的问题:

假设有fun next(prev: Int): Int。实现fun Int.nextValue(): Int,它返回与第一个函数相同的值。

预先感谢

2 个答案:

答案 0 :(得分:0)

扩展方法允许您在不更改对象类定义的情况下将方法添加到对象。当您从第三方获得库而无权访问源代码时,这通常很有用。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginxv1
  template:
    metadata:
      labels:
        app: nginxv1
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 8080
---    
apiVersion: v1
kind: Service
metadata:
  name: nginxv1
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 30100
  selector:
    app: nginxv1
  type: NodePort

答案 1 :(得分:0)

Kotlin中的扩展基于编程语言理论中的扩展理论。某些语言(例如Swift)允许您扩展您不拥有的类。这种可扩展性的想法来自将自定义成员添加到以前存在的类型的需要。这允许创建特定于域的语言,以便使某些域中的编程更易于读写和维护。在语言开发中,它已成为一个越来越流行的概念,从而引发了类型类的想法。但是,让我们从基础开始。

扩展方法允许我们用接收者调用过程。接收器的类型几乎类似于过程的主题。考虑一下语音:例如,我们有一个主语和一个宾语。我们的主题是我们用作消息接收者的对象,例如“我想去商店”。我们说主题 I 与子句想去和对象 store 一起使我们能够构造一条消息< em>围绕主题。我们知道消息是关于主题 I 的。您可以将扩展方法的接收者视为该方法的主题。

fun Int.next(): Int = this + 1

上述方法完全等同于以下功能

fun next(prev: Int): Int = prev + 1

之所以它们等效,是因为我们要使用 prev 参数并将其转换为 receiver subject ,因为我们希望这样做围绕我们的参数的方法。我们正在扩展 Int 类型的功能,以便我们可以使用新获取的方法,就好像该方法是 Int 的一部分一样,即使不是。 Java虚拟机将以这种方式显示

public static int next(int receiver){
    return receiver + 1;
}

正如您所看到的,我们还使用了 this 运算符,这是由于我们的行为就像我们在接收器类型之内一样。在扩展方法主体中使用 this 与在新声明的类中使用 this 相同。

class A(val name: String){
    fun a(){
        println(this.name)
    }
}

现在, next 是扩展的一个非常基本的示例,但是它们确实能够处理一些相当复杂的事情。扩展方法的一个更好的示例是通过换行符分割字符串并过滤出空行。

fun String.linesNoBlank() =
    this.lines()
        .filter{ it.isNotBlank() }

该方法不仅可以使用,而且可以扩展为进行其他类型的计算。想象一下在数据库上执行此操作以过滤掉某些类型的数据,例如查询。