繁体   English   中英

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

[英]can implicit functions in scala have 2 input parameters?

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

Scala 没有称为隐式函数的功能,但它确实具有称为视图或有时称为隐式转换的功能。 它的工作原理如下:如果你有一个类型 A => B 的隐式值,或者一个可以在 scope 中扩展为这样一个值的隐式 def,当你传递一个类型 A 的值的地方期望一个类型 B 的值时,或者当您在B上有一些xA上没有的地方选择 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM