【问题标题】:Function Literal referencing by val and def由 val 和 def 引用的函数字面量
【发布时间】:2014-04-03 22:42:09
【问题描述】:

我试图了解这两种引用/定义Function Literal(引用anonymous function)的方法之间的关键区别:

val

scala> val v2 = new Function[Int, Int] {
     | def apply(a: Int): Int = a + 1
     | }
v2: Int => Int = <function1>

def

scala> def f2 = new Function[Int, Int] {
     | def apply(a: Int): Int = a + 1
     | }
f2: Int => Int

似乎在使用方面几乎相同。我可以将v2f2 传递给接受(Int) =&gt; Int 作为参数的函数。将参数传递给它的..

我猜还是 v2 的情况它创建了一个引用 Function1 对象的 Function1 对象.. 就像 proxy 一样?

好的..我的问题是:第一种和第二种方法的优缺点是什么?

其中的定义是def,还是Function Literal吗?

【问题讨论】:

标签: scala function-literal


【解决方案1】:

首先,您的示例都不是真正的函数文字—您正在以普通的无糖方式创建Function 实例,实际上您可以使用这种方法( new Function { ... }) 从 Java 代码创建 scala.Function 的实例。

以下都是函数字面量,完全等同于您的定义:

val v2 = (a: Int) => a + 1
def f2 = (a: Int) => a + 1

这里唯一真正的区别是val 将一劳永逸地创建一个实例,无论您使用多少次v2(即使您从未使用它),而def 将每次都创建一个新实例(或者根本不创建,如果你从不使用它)。因此,您通常会希望使用val

但是,在某些情况下,您需要使用def。考虑以下几点:

def myIdentity[A] = (a: A) => a

我们不可能把它写成val,因为Scala 没有这种意义上的多态函数(Function[A, B]AB 的任何实例都必须是具体类型)。但是我们可以定义一个返回函数的多态方法,并且当我们编写例如myIndentity(1)A 将被推断为 Int,我们将完全按照您的预期创建(并应用)Function[Int, Int]

【讨论】:

  • 如果它们完全等同于我的定义,并且由于它是语法糖,它们应该是函数文字(?)。首先,我想出了您的简单示例-结果/输出似乎相同。
  • 在此上下文中的术语 literal 专门指语法,因此您可以将糖化版本称为函数文字,而不是通过new 进行的普通旧实例化。
  • @ses 4(2+2) 完全等价,但第一个是整数文字,第二个不是。这里也一样。
猜你喜欢
  • 1970-01-01
  • 2017-09-19
  • 2013-09-24
  • 2021-10-17
  • 1970-01-01
  • 2011-05-25
  • 2013-11-05
  • 2018-10-01
相关资源
最近更新 更多