【发布时间】:2015-04-03 13:08:58
【问题描述】:
如何使for 语句中引入的变量(一个枚举器,在规范中被称为隐式)?
这是我喜欢写的一个例子:
for (implicit genNum: GenNum <- NumGens(200)) {
val explicitArg = // . . .
funcWithImplicitGenNum(explicitArg) // <-- gen passed implicitly here
}
funcWithImplicitGenNum 声明如下:
def funcWithImplicitGenNum(explicitArg: Whatever)(implicit gen: GenNum) = ???
如果我正确理解规范,它不允许 for 的枚举器是隐式的,所以我必须这样做:
for (g <- NumGens(200)) {
implicit val genNum: GenNum = g
val explicitArg = // . . .
funcWithImplicitGenNum(explicitArg) // <-- gen passed implicitly here
}
这种解决方法不是世界末日,但它困扰着我。在我的实际程序中,我在各处隐式传递了几个变量,它们提供了发生某事的整体上下文。 Scala 的隐式在这方面非常出色:它们极大地减少了代码中的混乱程度,而调用堆栈深处的函数可以访问该上下文信息。唯一的例外是for 循环:我必须使用这种笨拙的技巧来定义等于枚举变量的val。
有没有办法隐式传递genNum?或者,如果不是,您是否知道我应该为 for 语句不允许将其 Enumerator 设为隐式感到高兴的原因? (通常,如果您知道语言功能的基本原理,您会更好地了解如何“顺其自然”。)
这里有一点背景,如果有帮助的话。我正在编写一个使用各种变异算子的遗传算法。变异算子不应该知道它被调用的是哪一代。但我也在收集有关突变在不同世代中表现的数据。数据收集代码确实需要知道它是哪一代,以及其他一些东西。因此,我显式传递了与突变相关的变量,隐式传递了数据收集所需的变量。
【问题讨论】: