복붙노트

[SCALA] 스칼라의 방법 및 기능의 차이점

SCALA

스칼라의 방법 및 기능의 차이점

나는 (스칼라의 또 다른 투어의 일부) 스칼라 함수를 참조하십시오. 해당 게시물에서 그는 말했다 :

그러나 그는 그것에 대해 아무것도 설명하지 않았다. 그가 말하려고했다?

해결법

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

    1.짐은 자신의 블로그 게시물에 포함이 꽤 많이 가지고,하지만 난 참조 여기 브리핑을 게시하도록하겠습니다.

    짐은 자신의 블로그 게시물에 포함이 꽤 많이 가지고,하지만 난 참조 여기 브리핑을 게시하도록하겠습니다.

    먼저, 스칼라 사양이 우리에게 무엇을 보자. 제 3 장 (유형) 기능 유형 (3.2.9) 및 방법의 유형 (3.3.1)에 대해 알려주십시오. 제 4 장 (기본 선언은) 가치 선언과 정의 (4.1), 변수 선언과 정의 (4.2) 및 함수 선언 및 정의 (4.6)을 말한다. 제 6 장 (표현)는 익명 함수 (6.23) 및 방법 값 (6.7)을 말한다. 호기심, 함수 값은 3.2.9에 한 번 언급하고, 어떤 다른 어디.

    함수 형태는 표준 라이브러리에서 형질 FunctionN 대한 속기 형태 (T1, ..., TN) => U의 (대략) 유형이다. 익명 함수 및 방법은 함수 값 유형을 가지고, 함수 유형 값, 변수 및 함수 선언 및 정의의 일부로서 사용될 수있다. 사실, 방법 유형의 일부가 될 수 있습니다.

    방법 형식이 아닌 값 형식입니다. 아무 객체 인스턴스 없음 - - 방법 유형 즉, 값이없는 것을 의미한다. 위에서 언급 한 바와 같이, 방법 값은 실제로 기능 유형이 있습니다. 방법의 유형은 데프 선언입니다 - 몸 제외 데프에 대한 모든 것을.

    값 선언과 정의 및 변수 선언과 정의가 발 두 종류와 값을 포함 VAR 선언입니다 - 될 수있는 각각 기능 유형 및 익명 함수 또는 메소드의 값입니다. 그것을 참고 JVM에,이 (방법 값) 자바 "방법"이라고 부르는로 구현됩니다.

    함수 선언은 유형 및 바디를 포함하는 방어 선언된다. 유형 부는 입력 방법이며, 본체는 식 또는 블록이다. 이것은 또한 자바는 "방법"이라고 부르는와 JVM에서 구현됩니다.

    마지막으로, 익명 기능이 기능 유형의 인스턴스 (즉, 특성 FunctionN의 인스턴스) 및 방법 값이 같은 일입니다! 차이는 메소드 값 (m은 _은 "함수 선언"에 대응하는 메소드 값 (DEF) m)의 방법에서, 하나 밑줄 postfixing 의해 생성되거나 같다 ETA 팽창이라는 프로세스에 의해된다는 것이다 방법에서 자동 캐스팅 기능한다.

    우리는 그 용어를 사용하지 마십시오 : 즉, 사양 무슨 말을, 그래서 내가이 선행을 만들어 보자입니다! 인 표현이며, "익명 함수", 및 "기능 유형"- 너무 많은 프로그램의 일부 (기본 선언 제 4 장)은 "함수 선언"소위 사이의 혼란에 이르게 잘 유형 - 형질.

    아래의 지식과 경험을 가진 스칼라 프로그래머가 사용하는 용어는 명세서의 용어에서 하나 변경하는 대신 함수 선언을 말하고, 우리는 방법을 말한다. 심지어 메소드 선언. 또한, 우리는 가치 선언과 변수 선언은 또한 실제적인 목적을위한 방법 참고.

    따라서, 용어 위의 변화를 주어, 여기에 구분의 실제적인 설명입니다.

    함수는 실제로 기능 1 연장 그것뿐만 아니라 PartialFunction를 포함 할 수있는 등 Function0, 기능 1, 기능 2, 같은 FunctionX 특성, 중 하나를 포함하는 것을 목적으로한다.

    의 이러한 특성 중 하나의 유형 서명을 보자 :

    trait Function2[-T1, -T2, +R] extends AnyRef
    

    이 특성은 하나 개의 추상 메소드 (그것뿐만 아니라 몇 가지 구체적인 방법이있다)이있다 :

    def apply(v1: T1, v2: T2): R
    

    그리고 그것에 대해 알고 있다는 것을 우리 모두를 말한다. 함수는 타입 T1, T2, ..., TN의 N 파라미터를 수신하는 적용 방법을 보유하고,이 결과에 수신 파라미터에 콘트라 변형 공동 변종 형 R. 무언가를 반환한다.

    그 차이는 [AnyRef 목록 [T]]은 기능 1 [서열 [T], 문자열] 기능 1의 서브 타입을 의미한다. 하위 유형 인 것은이 그것을 대신 사용할 수 있습니다 의미합니다. 하나는 쉽게 나는 F를 호출하는거야 경우 (목록 (1, 2, 3))과 AnyRef 다시, 두 가지 유형 중 하나 이상 일하는 것이 기대 것을 볼 수 있습니다.

    자, 방법 및 기능의 유사성은 무엇인가? f는 함수이며, m이 범위에 국부적으로하는 방법이면 좋고, 그 후에 양쪽 같이 호출 될 수있다 :

    val o1 = f(List(1, 2, 3))
    val o2 = m(List(1, 2, 3))
    

    첫 번째는 단지 문법 설탕이기 때문에 이러한 호출은, 실제로는 다르다. 스칼라 그것을로 확장 :

    val o1 = f.apply(List(1, 2, 3))
    

    어느 물론, 객체 F에 메소드 호출입니다. 함수 리터럴 (실제로 두) 및 (T1, T2) => R 유형 서명 : 함수는 또한 다른 구문의 장점 설탕이있다. 예를 들면 :

    val f = (l: List[Int]) => l mkString ""
    val g: (AnyVal) => String = {
      case i: Int => "Int"
      case d: Double => "Double"
      case o => "Other"
    }
    

    메소드와 함수의 또 유사성 전자가 후자 쉽게 변환 될 수있다 :

    val f = m _
    

    스칼라 m 타입으로 (리스트 [지능]) AnyRef (스칼라 270)는 가정, 즉 확장한다 :

    val f = new AnyRef with Function1[List[Int], AnyRef] {
      def apply(x$1: List[Int]) = this.m(x$1)
    }
    

    스칼라 2.8에서 실제로 클래스의 크기를 줄이기 위해 AbstractFunction1 클래스를 사용합니다.

    함수에서하는 방법에 - 하나 다른 방법으로 주위를 변환 할 수 없습니다 것을 알 수 있습니다.

    방법은, 그러나, 하나의 큰 장점이 있습니다 (물론,이 - 그들은 약간 빠를 수 있습니다) : 그들은 유형 매개 변수를받을 수 있습니다. 상기 f를 반드시이 (이 예에서는 목록 [지능])을 수신 목록의 유형을 지정할 수 있지만 예를 들어, m은 매개 변수화 할 수

    def m[T](l: List[T]): String = l mkString ""
    

    나는이 거의 모든 것을 다루고 있다고 생각하지만, 나는 남아있을 수있는 질문에 대한 답변이를 보완 할 수있을 것입니다.

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

    2.방법 및 함수 사이에 하나 개의 큰 실질적인 차이는 무엇을 의미하는지 반환합니다. 오직 반환하는 방법에서 반환합니다. 예를 들면 :

    방법 및 함수 사이에 하나 개의 큰 실질적인 차이는 무엇을 의미하는지 반환합니다. 오직 반환하는 방법에서 반환합니다. 예를 들면 :

    scala> val f = () => { return "test" }
    <console>:4: error: return outside method definition
           val f = () => { return "test" }
                           ^
    

    방법에 정의 된 함수에서 반환하는 로컬이 아닌 수익을 수행합니다

    scala> def f: String = {                 
         |    val g = () => { return "test" }
         | g()                               
         | "not this"
         | }
    f: String
    
    scala> f
    res4: String = test
    

    로컬 메소드로부터 반환하는 반면 해당 메소드로부터 반환합니다.

    scala> def f2: String = {         
         | def g(): String = { return "test" }
         | g()
         | "is this"
         | }
    f2: String
    
    scala> f2
    res5: String = is this
    
  3. ==============================

    3.스칼라 둘째 판에서 프로그래밍. 마틴 오더 스키 - 렉스 스푼 - 빌 베너 스

    스칼라 둘째 판에서 프로그래밍. 마틴 오더 스키 - 렉스 스푼 - 빌 베너 스

  4. ==============================

    4.당신이 목록이 있다고 가정하자

    당신이 목록이 있다고 가정하자

    scala> val x =List.range(10,20)
    x: List[Int] = List(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
    

    하는 방법을 정의

    scala> def m1(i:Int)=i+2
    m1: (i: Int)Int
    

    함수를 정의

    scala> (i:Int)=>i+2
    res0: Int => Int = <function1>
    
    scala> x.map((x)=>x+2)
    res2: List[Int] = List(12, 13, 14, 15, 16, 17, 18, 19, 20, 21)
    

    방법 수락 인수

    scala> m1(2)
    res3: Int = 4
    

    발과 기능을 정의

    scala> val p =(i:Int)=>i+2
    p: Int => Int = <function1>
    

    함수 인수는 선택 사항입니다

     scala> p(2)
        res4: Int = 4
    
    scala> p
    res5: Int => Int = <function1>
    

    방법에 대한 인수는 필수입니다

    scala> m1
    <console>:9: error: missing arguments for method m1;
    follow this method with `_' if you want to treat it as a partially applied function
    

    기능을 반환 함수를 만드는, 변수 등의 기능을 사용하는 방법 대 기능을 가진 DIFF의 다른 예와 같이 예와 다른 차이를 통과 설명합니다 다음 자습서를 확인하십시오

  5. ==============================

    5.기능 매개 변수의 기본값을 지원하지 않습니다. 방법 않습니다. 함수에 대한 방법에서 변환하는 매개 변수의 기본값을 잃는다. (스칼라 2.8.1)

    기능 매개 변수의 기본값을 지원하지 않습니다. 방법 않습니다. 함수에 대한 방법에서 변환하는 매개 변수의 기본값을 잃는다. (스칼라 2.8.1)

  6. ==============================

    6.내 설명의 대부분이 촬영되는 여기에 좋은 기사가있다. 나의 이해에 관한 함수 및 메서드의 짧은 비교. 희망이 도움이 :

    내 설명의 대부분이 촬영되는 여기에 좋은 기사가있다. 나의 이해에 관한 함수 및 메서드의 짧은 비교. 희망이 도움이 :

    기능 : 그들은 기본적으로 객체입니다. 보다 구체적으로, 기능은 적용 방법 오브젝트이고; 따라서, 그들은 그들의 오버 헤드의 방법보다 조금 느립니다. 그들이 호출하는 것을 목적으로 독립적 인 의미에서 정적 방법과 유사하다. 함수의 간단한 예는 울부 짖는 소리 같다 :

    val f1 = (x: Int) => x + x
    f1(2)  // 4
    

    줄 위 오브젝트 1 = object2처럼 다른 하나 개의 객체를 할당 제외하고는 아무것도 아니다. 사실 우리의 예에서 object2는 익명 함수이며 왼쪽 측면 때문에 그 객체의 유형을 가져옵니다. 따라서, 지금 F1 개체 (기능)이다. 익명 함수는 실제로는 1 개 종류의 지능 파라미터 int 형의 리턴 값을 가진 함수를 의미 기능 1 [INT, 지능]의 인스턴스이다. 인수없이 (F1)를 호출하면 우리에게 익명 함수의 서명을 줄 것이다 (INT => Int 인 =)

    행동 양식: 그들은 개체이지만 클래스의 인스턴스, 즉 할당되지 않습니다. 객체. 똑같은 (라피 Khatchadourian이 질문에 대한 댓글에서 지적) C ++에서 자바 또는 멤버 함수의 방법 등 방법의 간단한 예는 울부 짖는 소리 같다 :

    def m1(x: Int) = x + x
    m1(2)  // 4
    

    위의 라인은 간단한 값 할당하지만, 방법의 정의가 아닙니다. 두 번째 행과 같이 2 값이 메소드를 호출 할 때, X는 2로 치환되고, 그 결과가 계산되며 출력으로서 4를 얻는다. 단지이 방법이기 때문에 (M1)를 작성하고 입력 값을 필요로하는 경우 다음 오류가 발생합니다. 사용하여 _ 당신이 울부 짖는 소리와 같은 기능을하는 방법을 지정할 수 있습니다 :

    val f2 = m1 _  // Int => Int = <function1>
    
  7. ==============================

    7.여기서 여기서, 차이를 설명하는 TL 인 롭 노리스의 뛰어난 포스트이다 DR

    여기서 여기서, 차이를 설명하는 TL 인 롭 노리스의 뛰어난 포스트이다 DR

    다음과 같은 정의를 가진 :

    간단히 말해서 (블로그에서 추출) :

    우리가하는 방법을 정의 할 때 우리는 우리가 발에 할당 할 수 없습니다 것을 알 수있다.

    scala> def add1(n: Int): Int = n + 1
    add1: (n: Int)Int
    
    scala> val f = add1
    <console>:8: error: missing arguments for method add1;
    follow this method with `_' if you want to treat it as a partially applied function
           val f = add1
    

    정상적인 보이지 않는 ADD1의 유형을 참고; 지능 : 당신은 유형 (INT N)의 변수를 선언 할 수 없습니다. 방법은 값이 아니다.

    그러나, η 팽창 후위 연산자를 가산함으로써 (η "는 도착"을 발음한다), 우리는 함수 값으로하는 방법을 켤 수있다. (F)의 종류를 참고.

    scala> val f = add1 _
    f: Int => Int = <function1>
    
    scala> f(3)
    res0: Int = 4
    

    _의 효과는 다음의 등가를 수행한다 : 우리는 우리의 위임 방법으로 기능 1 인스턴스를 생성.

    scala> val g = new Function1[Int, Int] { def apply(n: Int): Int = add1(n) }
    g: Int => Int = <function1>
    
    scala> g(3)
    res18: Int = 4
    
  8. from https://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala by cc-by-sa and MIT license