gpt4 book ai didi

scala - 修改从 Scala 中的方法返回的值(Highcharts lib)

转载 作者:行者123 更新时间:2023-12-04 02:44:57 24 4
gpt4 key购买 nike

我在 Scala 中使用外部库,它使用一组特征将复杂的配置选项传递给不同的方法。这是 Highcharts Scala API,但问题似乎更普遍。

库定义了一个trait(实际使用中是HighchartsOptions),它只是一个数据传输对象,存储了一些字段并允许它们来回传递。为了清晰起见,简化和概括的代码如下所示:

trait Opts {
def option1: Int = 3
def option2: String = "abc"
//Many more follow, often of more complex types
}

只要可以在一个地方生成完整的选项集,就可以使用简洁的语法:

val opts = new Opts() {
override val option1 = 5
//And so on for more fields
}
doSomething(opts)

但是,在某些情况下,一段代码准备了这样的配置,而另一段代码只需要额外调整一个选项。如果能够将一些 Opts 实例传递给方法并让该方法修改一两个值,那就太好了。

由于原始特征基于 def 而不是 var,因此只有在对象类型已知的情况下才能轻松覆盖选项的值,例如上面的例子。 如果一个方法仅接收 Opts 的某个匿名子类的实例,它如何创建另一个实例或修改接收到的实例以便调用例如option2 可以返回不同的值吗? 所需的操作类似于 Mockito's spy确实如此,但是我觉得应该有一些比使用模拟框架更简单的方法来实现这种效果。

PS:实际上,我对图书馆作者使用这样的界面感到有点惊讶,所以也许我遗漏了一些东西,并且有一些完全不同的方法可以实现我的目标,即从多个选项中构建单个选项集代码中的不同位置(例如,一些可变的构建器对象,我可以传递它而不是完成的 HighchartsOptions)?

最佳答案

我会首先检查是否(单独)使用 Opts 特性是绝对必要的。希望它不是,然后你只需扩展特征,用 vars 覆盖 defs,就像你说的那样。

当 Opts 是强制性的并且您有它的实例要复制修改某些字段时,您可以执行以下操作:

为 Opts 编写一个包装器,它扩展 Opts,但将每次调用委托(delegate)给包装的 Opts,不包括您要修改的字段。将这些字段设置为您想要的值。为宽接口(interface)特征编写包装器可能是一项无聊的任务,因此您可以考虑使用 http://www.warski.org/blog/2013/09/automatic-generation-of-delegate-methods-with-macro-annotations/让宏自动生成其中的大部分内容。

关于scala - 修改从 Scala 中的方法返回的值(Highcharts lib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011399/

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