gpt4 book ai didi

scala - Scala 中的 apply 函数是什么?

转载 作者:行者123 更新时间:2023-12-03 04:01:06 25 4
gpt4 key购买 nike

我从来没有从人为的解码和动词名词(一个 AddTwo 类有一个 apply 添加两个!)示例中理解它。

我知道它是语法糖,所以(我从上下文推断)它一定是为了使某些代码更直观而设计的。

具有 apply 函数的类有何含义?它的用途是什么?它使代码变得更好(解码、动词名词等)的目的是什么?

在伴生对象中使用它有什么帮助?

最佳答案

数学家有他们自己的小有趣的方式,所以他们不会像我们程序员那样说“然后我们调用函数 f 并将其 x 作为参数传递”,而是说关于“将函数 f 应用于其参数 x”。

In mathematics and computer science, Apply is a function that applies functions to arguments.
Wikipedia

apply 的目的是缩小 Scala 中面向对象和函数式范例之间的差距。 Scala 中的每个函数都可以表示为一个对象。每个函数还具有 OO 类型:例如,接受 Int 参数并返回 Int 的函数将具有 Function1[Int,Int] 的 OO 类型.

 // define a function in scala
(x:Int) => x + 1

// assign an object representing the function to a variable
val f = (x:Int) => x + 1

由于 Scala 中的一切都是对象,因此 f 现在可以视为对 Function1[Int,Int] 对象的引用。例如,我们可以调用从 Any 继承的 toString 方法,这对于纯函数来说是不可能的,因为函数没有方法:

  f.toString

或者我们可以通过调用 f 上的 compose 方法并将两个不同的函数链接在一起来定义另一个 Function1[Int,Int] 对象:

 val f2 = f.compose((x:Int) => x - 1)

现在,如果我们想要实际执行该函数,或者像数学家所说的“将函数应用于其参数”,我们将调用 Function1[Int,Int]< 上的 apply 方法 对象:

 f2.apply(2)

每次要执行表示为对象的函数时都编写 f.apply(args) 是面向对象的方式,但会在不添加太多额外内容的情况下给代码添加很多困惑信息,如果能够使用更标准的符号,例如f(args),那就太好了。这就是 Scala 编译器介入的地方,每当我们引用函数对象的 f 并编写 f (args) 将参数应用于所表示的函数时,编译器都会默默地扩展 f (args) 到对象方法调用 f.apply (args)

Scala 中的每个函数都可以被视为一个对象,而且它的工作方式也相反 - 每个对象都可以被视为一个函数,只要它具有 apply 方法。此类对象可以用在函数表示法中:

// we will be able to use this object as a function, as well as an object
object Foo {
var y = 5
def apply (x: Int) = x + y
}


Foo (1) // using Foo object in function notation

在很多用例中,我们都希望将对象视为函数。最常见的情况是 factory pattern 。我们可以将对象应用到一组参数来创建关联类的新实例,而不是使用工厂方法给代码添加困惑:

List(1,2,3) // same as List.apply(1,2,3) but less clutter, functional notation

// the way the factory method invocation would have looked
// in other languages with OO notation - needless clutter
List.instanceOf(1,2,3)

因此 apply 方法只是缩小 Scala 中函数和对象之间差距的一种便捷方法。

关于scala - Scala 中的 apply 函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9737352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com