【问题标题】:Operator symbol for iterator - Kotlin迭代器的运算符符号 - Kotlin
【发布时间】:2021-09-20 23:43:04
【问题描述】:

我正在查看 Kotlin (kotlin.collections) 中的 Iterable 接口,并注意到它有一个函数 - 返回 Iterator 的迭代器函数。但是,我也注意到它有 operator 关键字。据我了解kotlin docs(如果我错了,请纠正我) operator 关键字用于语法糖,例如a.plus(b) 的运算符 fun 使我们能够编写 a + b 而不是编写 a.plus(b)。所以,我想知道,如果 iterator() 函数存在“语法快捷方式”,它是什么?还是有其他我不知道的目的?我在文档中找不到任何关于此的内容。

【问题讨论】:

  • 也许是循环时in的用法? for (i in

标签: kotlin


【解决方案1】:

documentation for for-loops(不是您可能看过的docs for operator overloading)提供了答案:

如前所述,for 遍历任何提供迭代器的东西。这意味着它:

  • 有一个返回Iterator<>的成员或扩展函数iterator()
  • 有成员或扩展功能next()
    • 有一个返回布尔值的成员或扩展函数hasNext()

这三个函数都需要标记为operator

for 循环需要 iterator()next()hasNext() 方法标记为 operator。这是operator关键字除了重载运算符之外的另一种用法。

对于 JVM 互操作性,实现 java.util.Iterable 的 Java 类不需要 operator 方法上的 operator 关键字,因为它在 Java 中不存在(这使得迭代 Java Iterables 成为可能来自 Kotlin 代码)。

【讨论】:

  • 哎呀,你比我的评论快了 40 秒左右。我不太确定“需要”是正确的词,就好像您实现自己的类一样,没有必要添加 operator 关键字。那是因为它是通过 override 关键字隐含的吗?
  • 您可以认为java.lang.Iterable.iterate 已经拥有operator 关键字(并且它是继承的)。来自the docs重写运算符重载时,可以省略operator
  • 嗯。 operator 用法的重点是允许您遍历 实现Iterable 的对象,只要它们具有必要的方法——即使它们只是扩展方法。因此,您不会像在 Java 中那样受对象层次结构的束缚。
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多