代码之家  ›  专栏  ›  技术社区  ›  Dims

Kotlin中的接收器操作员是否可以过载功能?

  •  1
  • Dims  · 技术社区  · 4 年前

    我可以定义 invoke 在教室里

    class A {
       fun invoke(x: Double): Double {
           ...
       }
    }
    

    然后使用类实例作为函数

    val a: A()
    val b = a(2.3)
    

    正当

    但我可以定义类实例来模拟带有接收器的函数吗?

    val o: MyClass()
    val a: A()
    val b = o.a(2.3)
    

    可能吗?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Joffrey    4 年前

    然后使用类实例作为函数

    这个 invoke 运算符只是定义使用语法时发生的事情的一种方法 () 在某些情况下。就像你可以超负荷什么 + 意思是你可以超负荷什么 () 方法这并不是一个很好的例子 A “可用作函数”,而是定义运算符 () 关于 A. 这就是为什么我认为它不能真正转化为“使其可用作接收器的功能”。

    声明扩展函数的简单方法如下:

    fun MyClass.a(input: Double): Double = TODO(...)
    

    但这似乎不适合你的需要。如果您真正想要的是像您的示例中那样“当场”动态地向某些实例添加“功能”之类的函数,那么我想您可以通过在作为作用域提供的类中定义这样的扩展来实现:

    class A {
       fun MyClass.a(x: Double): Double {
           ...
       }
    }
    
    fun main() {
        val o = MyClass()
        
        val b = with(A()) { // brings this instance of A in scope to add the extension
            o.a(2.3)
        }
    }