수학자들은 자신 만의 재미있는 방법을 가지고 있기 때문에 프로그래머가 말하는 것처럼 " f
그것을 함수 를 x
매개 변수로 전달하는 것 "이라고 말하는 대신 " f
인수에 함수 적용 하기 "에 대해 이야기 x
합니다.
수학과 컴퓨터 과학에서 Apply는 함수를 인수에 적용하는 함수입니다.
위키 백과
apply
Scala의 객체 지향 패러다임과 기능 패러다임 사이의 격차를 메우기위한 목적으로 사용됩니다. 스칼라의 모든 기능은 객체로 표현 될 수 있습니다. 모든 함수에는 OO 유형도 있습니다. 예를 들어 Int
매개 변수를 사용하고을 반환하는 함수 Int
는 OO 유형이 OO입니다 Function1[Int,Int]
.
// define a function in scala
(x:Int) => x + 1
// assign an object representing the function to a variable
val f = (x:Int) => x + 1
모든 것이 스칼라의 객체이기 때문에 f
이제 객체에 대한 참조로 취급 될 수 있습니다 Function1[Int,Int]
. 예를 들어, 함수에는 메소드가 없기 때문에 순수 함수로는 불가능했던 toString
에서 상속 된 메소드 를 호출 할 수 있습니다 Any
.
f.toString
또는 메소드를 Function1[Int,Int]
호출 하고 두 개의 다른 함수를 함께 연결 하여 다른 객체를 정의 할 수 있습니다.compose
f
val f2 = f.compose((x:Int) => x - 1)
이제 실제로 함수를 실행하거나 수학자가 "인수에 함수 적용"이라고 말하면 객체 에서 apply
메소드를 호출 Function1[Int,Int]
합니다.
f2.apply(2)
f.apply(args)
객체로 표현 된 함수를 실행할 때마다 쓰는 것은 객체 지향 방식이지만 많은 정보를 추가하지 않고 코드에 많은 혼란을 줄 수 있으며 더 많은 표준 표기법을 사용할 수 있습니다. 로 f(args)
. Scala 컴파일러가 들어가서 f
함수 객체에 대한 참조 가 있고 f (args)
표현 된 함수에 인수를 적용하기 위해 쓸 때마다 컴파일러 f (args)
는 객체 메소드 호출로 자동 확장 됩니다 f.apply (args)
.
스칼라의 모든 함수는 객체로 취급 될 수 있으며 다른 방식으로도 작동합니다. 모든 객체는 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
객체를 함수로 취급하려는 많은 사용 사례가 있습니다. 가장 일반적인 시나리오는 팩토리 패턴 입니다. 팩토리 메소드를 사용하여 코드에 혼란을 추가하는 대신 apply
인수 세트에 이의를 제기하여 연관된 클래스의 새 인스턴스를 작성할 수 있습니다.
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
메소드는 스칼라에서 함수와 객체 사이의 간격을 좁히는 편리한 방법입니다.