gpt4 book ai didi

scala - 如何在 Scala 中修补新的控制结构?

转载 作者:行者123 更新时间:2023-12-04 16:55:18 24 4
gpt4 key购买 nike

是否可以在 Scala 中修补新的控制结构?基本上我想定义几个控制结构,例如下面的除非方法,并让它们在我的项目中的任何地方都可以访问。

def unless(condition: => Boolean)(body: => Unit):Unit = if(!condition) body

最佳答案

您不能修改已经存在的对象的猴子补丁。但是,在大多数情况下,您可以编写一个以相同方式(并且可以说更安全)起作用的隐式转换。

首先,与unless正如所写,您不需要它成为每个类的方法。只需将其粘贴在某个对象中并导入即可。

object Utility {
def unless(condition: => Boolean)(body: => Unit):Unit = if(!condition) body
}

import Utility._

但有时您确实希望它像类上的方法一样。例如,我经常写
option.map(x => f(x)).getOrElse(default)

可以更紧凑地写成折叠:
option.fold(default)(x => f(x))

除了 Option没有折叠。所以我:
class OptionWrapper[A](o: Option[A]) {
def fold[Z](default: => Z)(action: A => Z) = o.map(action).getOrElse(default)
}
implicit def option_has_utility[A](o: Option[A]) = new OptionWrapper(o)

(这被称为“皮条客我的图书馆”模式)。现在我可以随心所欲地使用折叠,因为任何时候都有一个选项,我会调用 fold方法,编译器意识到没有 fold方法并四处寻找可以将类转换为确实具有 fold 的内容的任何方式.有这样一种方法,新类对现有选项所做的正是您希望从 fold 中获得的功能。类本身的方法。

关于scala - 如何在 Scala 中修补新的控制结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8028537/

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