gpt4 book ai didi

scala - Scala 或 Jython 中多方法的替代方案

转载 作者:行者123 更新时间:2023-12-04 22:53:21 26 4
gpt4 key购买 nike

我经常面临想要向我无法控制的类添加其他方法的问题。例如,我可能想要一个函数 prettyPrint可以对没有统一 api 的不同对象类型进行操作(例如特殊的 __str__ 方法)。
Nice语言和 R使用多方法来实现这一点,它很好地避免了访问者模式。例如,Rplot()功能。个别程序员可以创建新类来定义数据类型(例如,网络图或股票行情数据)。次要用户/程序员然后可以编写绘图函数来填充功能,即使他们无权访问图形或股票代码,或其他绘图函数的代码。

鉴于我想稍后添加很多功能,使用 class.method()似乎不可行。大量 class_plot()每种类型的函数似乎也是一个坏主意。定义一大 plot()检查类型的函数不可扩展。

多方法的替代方法是什么?特别是,我对可能适用于 Jython 和 Scala 的设计感兴趣。

最佳答案

在 Scala 中向类添加方法的最简单方法:

implicit def defSum(l: List[Double]): Double = new AnyRef { def sum = l.foldLeft(0.0)(_ + _) }

或者,在 Scala 2.8 上,对于处理数字的方法的特殊情况,
implicit def defSum[T](l: List[T])(implicit n: Numeric[T]) = new AnyRef {
import n.mkNumericOps
def sum = l.foldLeft(n.zero)(_ + _)
}

只有在 Scala 2.8 上不需要这个,因为它定义了 sum已经。

您还可以在实例化时添加特征:
// Immutable class
case class Point(x: Int, y: Int)

// Somewhere else in the code
trait MyPlot {
self: Point =>
import self._

def plot = println("At "+x+", "+y)
}

// Usage
val p = new Point(1,2) with MyPlot
p.plot

您不能做的是动态地(即在运行时而不是编译时)向对象添加方法。在第一种情况下,您说的是“将此方法添加到此类”。在第二种情况下,您是说“使用此特征创建此对象”。这些没问题,但“将此方法添加到此对象”不是。

关于scala - Scala 或 Jython 中多方法的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1324366/

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