![](/img/trans.png)
[英]Use functions from a Scala object that have implicit parameters in java code
[英]can implicit functions in scala have 2 input parameters?
我试图在 scala 中找到隐式函数的各种用例,但我发现隐式 function 只有一个参数的示例,它可以有 2 个参数吗,如果是的话,它的用例也是什么,我想知道哪些是使用隐式函数的真实场景?
Scala 没有称为隐式函数的功能,但它确实具有称为视图或有时称为隐式转换的功能。 它的工作原理如下:如果你有一个类型 A => B 的隐式值,或者一个可以在 scope 中扩展为这样一个值的隐式 def,当你传递一个类型 A 的值的地方期望一个类型 B 的值时,或者当您在B
上有一些x
但A
上没有的地方选择 ax 时,则首先调用该转换。
所以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}"
}
另外,您可以阅读官方文档IMPLICIT CLASSES
请注意, 隐式函数已重命名为上下文函数。 它们现在记录在此处。
我试图在 scala 中找到隐式函数的各种用例,但我发现只有一个参数到隐式 function 的示例,它可以有 2 个参数吗
是的。 它可以有任意多的参数。 (Scala 3中不再存在22个参数限制。)
从规范中可以清楚地看出没有限制:
上下文 function 类型是 class 类型的简写,它定义了带有上下文参数的
apply
方法。 具体来说,N
-ary function 类型T1,…, TN => R
是 class 类型ContextFunctionN[T1,…, TN, R]
的简写。 对于N >= 1
的任何值,假定此类 class 类型具有以下定义:[…]
再往下:
上下文 function 类型概括为
N > 22
,其方式与 function 类型相同
因此,很明显可以有任意数量的参数。
如果是的话,它的用例是什么
一个明显的用例是,如果您不想要单个上下文,但想用多个正交位组成您的上下文。 想象一下您同时需要日志记录和事务的场景。 没有理由认为这应该是一个单一的整体上下文。
另外,我想知道哪些是使用隐式函数的真实场景?
Scala 3 尚未发布,因此代码体仍然有限。 使用 Scala 3 构建的最大系统可能是 Scala 3 编译器本身,它确实大量使用了上下文函数。 不过,不像上下文参数那么重。
我怀疑绝大多数隐式函数只会有一个参数。 但这不是人为限制它们的理由。 Scala 的一些主要目标是简单性、规律性和正交性,没有任何奇怪的异常或极端情况。
方法可以有任意多个参数,普通函数可以有任意多个参数,类型构造函数可以有任意多个参数,构造函数可以有任意多个参数,实际上任何可以带参数的东西都可以带任意多个参数,这很奇怪人为地只限制隐式函数。
我的意思是,绝大多数类型构造函数、方法和普通函数可能也只有一个参数,或者最多两个,但我们也不限制它们。 事实上, Product
s、 Tuple
s、 Function
s、 PartialFunction
s 和case class
es 的任意 22 个参数限制一直是 Scala 2 中痛苦的重要来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.