복붙노트

[SCALA] 스칼라에서 적용되는 기능은 무엇입니까?

SCALA

스칼라에서 적용되는 기능은 무엇입니까?

나는 (AN AddTwo 클래스는 그 두 가지를 추가 적용있다!) 예제 인위적인 비 정렬 화 및 verbing 명사에서 그것을 이해하지 않습니다.

나는 그것이 문법적, 그래서 일부 코드는보다 직관적 수 있도록 설계되어 있어야합니다 (I 문맥에서 추론)을 이해합니다.

무엇을 의미하는 것은 적용 기능을 가진 클래스가 제공합니까? 그것을 사용하고, 어떤 목적으로이 코드 더 나은 (비 정렬 화, 명사 등을 verbing를) 만들 않는 무엇입니까?

동반자 개체에 사용할 때 어떻게 도움이 되나요?

해결법

  1. ==============================

    1.수학자 그래서 대신에 우리 프로그래머들이 말하는 것처럼, 그들은 "그 인자 x에 f를 함수를 적용"에 대해 이야기 "우리는 매개 변수로 X 전달 f를 함수를 호출"라고 자신의 작은 재미 방법이있다.

    수학자 그래서 대신에 우리 프로그래머들이 말하는 것처럼, 그들은 "그 인자 x에 f를 함수를 적용"에 대해 이야기 "우리는 매개 변수로 X 전달 f를 함수를 호출"라고 자신의 작은 재미 방법이있다.

    적용 스칼라 객체 지향 패러다임 및 기능 사이의 간극을 폐쇄하는 목적을 제공. 스칼라의 모든 기능은 객체로 표현 될 수있다. 모든 기능은 또한 OO 유형이있다 : 예를 들면, 지능 파라미터를 취하고 int를 반환하는 함수가 기능 1 [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의 목적은 지금 기능 1 [INT, 지능] 객체에 대한 참조로서 취급 할 수 있기 때문에. 기능이 방법이 없기 때문에 예를 들어, 우리는 순수한 기능에 불가능했을 것입니다 어떤로부터 상속 된 toString 메소드를 호출 할 수 있습니다 :

      f.toString
    

    아니면 F에 작성 메소드를 호출하고 두 개의 다른 기능을 체인에 의해 다른 기능 1 [INT, 지능] 오브젝트를 정의 할 수있다 :

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

    우리가 실제로 기능을 실행하거나 수학자로 말한다 "인수에 함수를 적용"할 경우 이제 우리는이 기능 1 [INT, 지능] 개체의 방법을 적용 부를 것이다 :

     f2.apply(2)
    

    객체 지향 방법은 당신이 개체로 표현되는 기능을 실행 할 때마다 f.apply (인수를)되어 작성하지만, 많은 추가 정보를 추가하지 않고 코드에 혼란을 많이 추가 할 수 그것은 좋은 것입니다 것은 할 수 있도록 이러한 F (인수)와 같은 더 많은 표준 표기법을 사용한다. 우리 함수 오브젝트 f는 기준이 컴파일러가 자동 객체 메소드 호출 f.apply (인수) 내지 F (인수)을 확장 표현 된 함수에 대한 인수를 적용 F (인수)를 작성할 때마다 그 위치를 스칼라 컴파일러 단계 및이다.

    스칼라의 모든 기능은 객체로 취급 될 수 있고 너무 다른 방식으로 작동합니다 - 모든 개체가 함수로 취급 할 수는 적용 방법이있다 제공했다. 이러한 객체는 함수 표기법을 사용할 수 있습니다 :

    // 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 
    

    우리가 함수로 객체를 취급 할 것이다 많은 사용 경우가 있습니다. 가장 일반적인 시나리오는 공장 패턴이다. 대신 팩토리 메소드를 사용하여 코드에 혼란을 추가하는 우리는 관련 클래스의 새로운 인스턴스를 작성하는 인수 세트에 객체를 적용 할 수 있습니다 :

    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) 
    

    그래서 방법은 스칼라 함수와 객체 사이의 격차를 단지 편리한 방법입니다 적용됩니다.

  2. ==============================

    2.그것은 당신이 종종 객체에 뭔가를 적용 할 아이디어에서 비롯됩니다. 더 정확한 예는 공장의 하나입니다. 당신이 공장을 가지고, 당신은 객체를 만드는 데에 매개 변수를 적용 할.

    그것은 당신이 종종 객체에 뭔가를 적용 할 아이디어에서 비롯됩니다. 더 정확한 예는 공장의 하나입니다. 당신이 공장을 가지고, 당신은 객체를 만드는 데에 매개 변수를 적용 할.

    스칼라 사람은 많은 상황에서 발생하는 한, 적용 전화 바로 가기가 좋을 수 있다고 생각했다. 당신이 개체에 직접 매개 변수를 제공 할 때 해당 객체의 적용 기능에 이러한 매개 변수를 전달하는 것처럼 따라서,이 desugared 것 :

    class MyAdder(x: Int) {
      def apply(y: Int) = x + y
    }
    
    val adder = new MyAdder(2)
    val result = adder(4) // equivalent to x.apply(4)
    

    그것은 종종 동반자 개체에서 사용하는 것 클래스 또는 특성에 대한 좋은 공장 방법을 제공하는 데, 여기에 예입니다 :

    trait A {
      val x: Int
      def myComplexStrategy: Int
    }
    
    object A {
      def apply(x: Int): A = new MyA(x)
    
      private class MyA(val x: Int) extends A {
        val myComplexStrategy = 42
      }
    }
    

    스칼라 표준 라이브러리에서, 당신은 scala.collection.Seq 구현하는 방법을 볼 수 서열은 (1, 2) 컴파일되지 않습니다하지만 덕분에 동반자 객체에와 적용, 당신이 호출 할 수 있습니다 (1 서열 형질, 따라서 새로운 서열이다 2) 상기 구현은 동반자 객체가 선택된다.

  3. ==============================

    3.여기에 신속하게 정독하고자하는 사람들을위한 작은 예입니다

    여기에 신속하게 정독하고자하는 사람들을위한 작은 예입니다

     object ApplyExample01 extends App {
    
    
      class Greeter1(var message: String) {
        println("A greeter-1 is being instantiated with message " + message)
    
    
      }
    
      class Greeter2 {
    
    
        def apply(message: String) = {
          println("A greeter-2 is being instantiated with message " + message)
        }
      }
    
      val g1: Greeter1 = new Greeter1("hello")
      val g2: Greeter2 = new Greeter2()
    
      g2("world")
    
    
    } 
    
  4. from https://stackoverflow.com/questions/9737352/what-is-the-apply-function-in-scala by cc-by-sa and MIT license