我试图在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的一些主要目标是简单性,规则性和正交性,没有任何奇怪的例外或极端情况。
方法可以有任意多个参数,普通函数可以有任意多个参数,类型构造函数可以有任意多个参数,构造函数可以有任意多个参数,实际上所有可以带参数的东西都可以取任意多个参数,人为地只限制隐式函数会很奇怪。
我的意思是,绝大多数类型构造函数、方法和普通函数可能也只有一个参数,或者最多两个,但我们也不限制它们。事实上,Product
s、Tuple
s、Function
s、PartialFunction
s 和case class
es 的任意 22 个参数限制一直是 Scala 2 中痛苦的重要来源。