【问题标题】:call-by-name parameter按名称调用参数
【发布时间】:2012-02-07 17:20:13
【问题描述】:

任何人都可以给我解释如何在 scala 编译器中按名称调用? 该方法的语法快捷方式如下:arg:=>Int 将转换为arg: () => Int 并捕获传递给函数的参数,如何闭包? 即按名称调用参数的真实类型,例如:Function0[_]?

谢谢。

【问题讨论】:

  • 你想做什么?问题不清楚。
  • @DanielC.Sobral 你好。假设我想要这样的东西:def foo(i: =>Int): Either[Int,Function1[here need the type of 'call-by-name' parameter,Either[_,_]]]我该怎么写?纯假设的问题......

标签: scala types


【解决方案1】:

按名称调用参数,正如您自己发现的那样,脱糖为Function0[A]。他们没有一流的支持,因此没有不同的类型。

您可以使用 Scalaz 的 Name 来实现这些目标。为此,请参阅接受的答案here

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,是的,语法 => Int 本质上是匿名无参数函数 () => Int 的轻量级语法,在 Scala 中由类型 Function0[Int] 表示。此外,在 VM 中,按名称参数转换为内部类。

    【讨论】:

      【解决方案3】:

      按名称参数的类型是无参数方法(请参阅@som-snytt 的评论)。它不能在 Scala 2.x 的任何地方使用除了方法的参数类型。

      您可以使用Function0 代替按名称传递的参数,但具有不同的语义。

      【讨论】:

      • 按照规范,它是一种“方法类型”。
      • @som-snytt 我想知道这是否是新事物。我很确定我在 2012 年花了很长时间研究规范,而“按名称”当时不被认为是一种类型。您在规范中有参考吗?
      • 我在别名和重复参数方面都遇到了问题,尤其是在重载方面。方法类型是scala-lang.org/files/archive/spec/2.13/… 和名称scala-lang.org/files/archive/spec/2.13/… 明确表示它是“无参数方法类型”。很抱歉复活一个旧答案;你的话特别有分量。另一种反应也将其视为糖。我想知道使用的是 2.8 还是 2.9。
      • @som-snytt 如果它是 2.7,我不会感到惊讶!我猜是 2.8,虽然似乎 2.9 已经出现了?不过,我不确定规范是否已更新。方法类型的特殊情况的措辞对我来说确实很陌生。它似乎是后来添加的,但是,嘿,我可能错了。
      猜你喜欢
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2011-05-21
      • 2015-06-07
      相关资源
      最近更新 更多