Scala 中的隐式函数可以有 2 个输入参数吗?



我试图在scala中找到隐式函数的各种用例,但我发现隐式函数只有一个参数的示例,如果是的话,它可以有2个参数吗,它的用例是什么,我想知道哪些是使用隐式函数的真实场景?

Scala没有称为隐式函数的功能,但它确实有一个称为视图的功能,有时也称为隐式转换。它的工作原理如下:如果您有一个类型 A => B 的隐式值,或者有一个可以在作用域中扩展到此类值的隐式 def,当您传递类型 A 的值时需要 B 类型的值时,或者当您选择 a.x 时,B上有一些x,但在A上没有, 然后,在第一次调用该转换。

因此,implicit def foo(a: A): B = ???可以扩展为implicit val A => B,并且是符合条件的隐式转化,但implicit def foo(a: A, b: B): C = ???不能,因此不符合转化条件。

可能你的意思是method extension.在这种情况下,您可以扩展tuple(或case class)

def main(args: Array[String]): Unit = {
val tuple = ("John", "Smith")
val concat = tuple.tupleConcat
println(concat)
}
implicit class TupleExt(val tuple: (String, String)) extends AnyVal {
def tupleConcat = s"${tuple._1} ${tuple._2}"
}

另外,您可以阅读官方文档隐式类

请注意,隐式函数已重命名为上下文函数。它们现在记录在这里。

试图在scala中找到隐式函数的各种用例,但是我发现只有一个参数的示例指向隐式函数,它可以有2个参数吗

是的。它可以具有任意数量的参数。(22 个参数的限制在 Scala 3 中不再存在。

从规范中可以清楚地看出,没有限制:

上下文

函数类型是使用上下文参数定义apply方法的类类型的简写。具体来说,N-ary 函数类型T1,… , TN => R是类类型ContextFunctionN[T1 ,… , TN, R]的简写。对于任何N >= 1值,假定此类类型具有以下定义: [...]

再往下:

上下文函数类型

以与函数类型相同的方式泛化为N > 22

因此,很明显,可以有任意数量的参数。

如果是,它的用例是什么

显而易见的用例是,如果您不想要单个上下文,而是希望从多个正交位中组合上下文。假设您同时需要日志记录和事务。没有理由认为这应该是单个整体上下文。

另外,我想知道哪些是使用隐式函数的真实场景?

Scala 3 尚未发布,因此代码主体仍然有限。使用 Scala 3 构建的最大系统可能是 Scala 3 编译器本身,它确实大量使用上下文函数。不过,没有上下文参数那么重。

怀疑绝大多数隐式函数只有一个参数。但这不是人为限制它们的理由。Scala的一些主要目标是简单性,规则性和正交性,没有任何奇怪的例外或极端情况。

方法可以有任意多个参数,普通函数可以有任意多个参数,类型构造函数可以有任意多个参数,构造函数可以有任意多个参数,实际上所有可以带参数的东西都可以取任意多个参数,人为地只限制隐式函数会很奇怪

我的意思是,绝大多数类型构造函数、方法和普通函数可能也只有一个参数,或者最多两个,但我们也不限制它们。事实上,Products、Tuples、Functions、PartialFunctions 和case classes 的任意 22 个参数限制一直是 Scala 2 中痛苦的重要来源。

相关内容

  • 没有找到相关文章

最新更新