gpt4 book ai didi

scala - 隐式可以在调用站点更改方法的参数多重性吗?

转载 作者:行者123 更新时间:2023-12-01 01:00:09 26 4
gpt4 key购买 nike

我的 API 原型(prototype)如下:

我有名为 ZResponseHandler 的第三方 API 对象有方法

printZ(z:Z) 

不,我有以下内容:
case class X
case class Y
case class Z(x:X,y:Y)

现在,当我使用带有新 z 实例的 API 调用 printZ 方法时,它可以正常工作。
ZResponseHandler.printZ(new Z(x,y))

但我想创建这样的东西:
implicit def convertXYtoZ(x:X,y:Y):Z = new Z(x,y)

ZResponseHandler.printZ(x,y)

这段代码给了我编译错误 - too many arguments for method printZ:
有没有办法让任何隐式类接受 printZ(x,y)?

最佳答案

隐式可以使用 wrap 或 "pimp"接收器用更多的方法来装饰它。

class R {
def m (s: String) = println(s)
}

// This uses an anonymous type, but it could also return
// `new RichR(r)` or similar as appropriate.
implicit def toRichR(r: R) = new {
def m(a: String, b: String) = r.m(a + " " + b)
}

val r = new R()
r.m("hello", "world") // -> toRichR(r).m("hello", "world")

Implicit classes (Scala 2.10+)还允许更清楚地编写上述模式。
implicit class RichR(r: R) {
def m(a: String, b: String) = r.m(a + " " + b)
}

对象也可以在 Scala 2.10(但不是 2.8)中“拉皮条”
object R {
def m (s: String) = println(s)
}

// uses TheObject.type
implicit def toRichR(_r: R.type) = new {
// (could use _r.m instead of R.m)
def m(a: String, b: String) = R.m(a + " " + b)
}

R.m("hello", "world") // -> toRichR(r).m("hello", "world")

(也有隐式对象,但如果没有通用的 [非对象] 基类型,我无法让它们工作。)

关于scala - 隐式可以在调用站点更改方法的参数多重性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com