복붙노트

[SCALA] 당신이 등 괄호, 점, 중괄호, = (기능)을 생략 할 수있는 경우에 대한 정확한 규칙은 무엇입니까?

SCALA

당신이 등 괄호, 점, 중괄호, = (기능)을 생략 할 수있는 경우에 대한 정확한 규칙은 무엇입니까?

당신이 등 (생략) 괄호, 점, 중괄호, = (기능)을 생략 할 수있는 경우에 대한 정확한 규칙은 무엇입니까?

예를 들어,

(service.findAllPresentations.get.first.votes.size) must be equalTo(2).

왜 내가 갈 수 :

(service findAllPresentations get first votes size) must be equalTo(2)

?

컴파일러 오류는 다음과 같습니다

왜 내가 매개 변수를 전달하기 위해 노력하고있어 생각합니까? 이유는 모든 메소드 호출에 도트를 사용한다?

왜 (service.findAll 프레젠테이션 먼저 표를 크기를 얻을) (2) 결과와 동일해야합니다 :

아직은의 "이 동일해야합니다" (service.findAll Presentations.get.first.votes.size은) 메소드 체인이 잘 작동, 즉, EqualTo가 2를해야합니다? - 객체 체인 체인 체인 PARAM.

나는 스칼라 책과 웹 사이트를 통해 봤는데 정말 포괄적 인 설명을 찾을 수 없습니다.

롭 H는 생략에 유효한 사용 사례를 내가 스칼라에서 생략 할 수 있습니다 어떤 캐릭터? 스택 오버플로 문제의 설명과 그것이 사실인가 '.' "피연산자 연산자 피연산자"스타일의 작업과없는 방법 체인입니다?

해결법

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

    1.당신은 대답 우연히 것 같다. 어쨌든, 나는 그것을 명확하게하려고합니다.

    당신은 대답 우연히 것 같다. 어쨌든, 나는 그것을 명확하게하려고합니다.

    소위 운영자 표기법을 - 접두사, 중위 및 후위 표기법을 사용하는 경우이 점을 생략 할 수 있습니다. 운영자 표기법을 사용하는 동안 메서드에 전달보다 작은 두 개의 매개 변수가있는 경우, 단지 다음, 당신은 괄호를 생략 할 수 있습니다.

    이제 오퍼레이터 표기가 호출되는 객체의 부재하에 사용될 수 없다는 것을 의미 메소드 호출에 대한 표기이다.

    간략 상세 표기법을거야.

    접두사:

    ! 만 ~, +와 - 접두사 표기법으로 사용할 수 있습니다. 이것은 당신이 쓸 때 사용하는 표기법입니다! 플래그 또는 발 책임 = -debt.

    중위 :

    즉, 메소드가 객체와 그것의 매개 변수 사이에 나타나는 표기입니다. 산술 연산자는 모두 여기에 맞게.

    후위 (또한 접미사) :

    상기 방법은 오브젝트를 다음과 매개 변수를 수신하지 않을 때 즉, 표기가 사용된다. 예를 들어, 목록 꼬리를 쓸 수 있습니다, 그것은 후위 표기법입니다.

    당신은 체인 중위 표기 한있는 방법은 카레 없기 때문에, 문제없이 호출 할 수 있습니다. 예를 들어, 나는 다음과 같은 스타일을 사용하려면 :

    (list
     filter (...)
     map (...)
     mkString ", "
    )
    

    즉, 같은 일 등이다 :

    list filter (...) map (...) mkString ", "
    

    필터와지도가 하나의 매개 변수를 사용하면 지금 내가 왜 여기에 괄호를 사용하고? 내가 그들에게 익명 함수를 전달 해요 때문이다. 내 익명 함수의 끝 부분에 대한 경계를 필요로하기 때문에 나는 중위 스타일 익명 함수 정의를 혼합 할 수 없습니다. 또한, 익명 함수의 매개 변수 정의는 중위 메소드의 마지막 매개 변수로 해석 될 수 있습니다.

    여러 매개 변수를 삽입 사를 사용할 수 있습니다 :

    string substring (start, end) map (_ toInt) mkString ("<", ", ", ">")
    

    카레 기능 중위 표기법으로 사용하기 어렵다. 접이식 기능은 명확한 예입니다 :

    (0 /: list) ((cnt, string) => cnt + string.size)
    (list foldLeft 0) ((cnt, string) => cnt + string.size)
    

    당신은 중위 통화 이외의 괄호를 사용해야합니다. 여기 놀이에 정확한 규칙을 모르겠어요.

    이제, 후위에 대해 이야기하자. 이 식의 끝이 아닌 장소에서 사용하지 않을 수 있기 때문에 후위는 사용하기 어려울 수 있습니다. 예를 들어, 다음을 수행 할 수 없습니다

     list tail map (...)
    

    꼬리는 식의 말에 나타나지 않기 때문에. 이 중 하나를 수행 할 수 없습니다

     list tail length
    

    당신은 표현의 끝을 표시하기 위해 괄호를 사용하여 중위 표기법을 사용할 수 있습니다 :

     (list tail) map (...)
     (list tail) length
    

    이 안전하지 않을 수 있기 때문에 그 후위 표기법이 권장되지 않습니다.

    나는이 모든 의심을 삭제 되었기를 바랍니다. 아니, 그냥 댓글을 삭제하고 나는 그것을 개선하기 위해 무엇을 할 수 있는지 볼 수 있습니다.

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

    2.발 또는 VAR은 매개 변수가 비공개 것이다 클래스 매개 변수를 생략 할 수있다.

    발 또는 VAR은 매개 변수가 비공개 것이다 클래스 매개 변수를 생략 할 수있다.

    VAR 추가 또는 발 (즉, 방법의 접근 및 뮤 테이터가 생성)은 공개하게됩니다.

    클래스 시체가없는 경우 {}, 즉 생략 될 수있다

    class EmptyClass
    

    그들은 컴파일러에 의해 추정 할 수있는 경우 일반 매개 변수를 생략 할 수 있습니다. 당신의 유형이 일치하도록 다음 형식 매개 변수가 항상 infered되고, 일치하지 않는 경우에는주의. 그래서 유형을 지정하지 않고, 당신은 당신이 무엇을 기대하지 못할 수도 있습니다 - 즉 주어진입니다

    class D[T](val x:T, val y:T);
    

    이것은 당신에게 유형의 오류를 줄 것이다 (INT는, 예상되는 문자열을 찾을 수 없음)

    var zz = new D[String]("Hi1", 1) // type error
    

    이 잘 작동 반면 :

    var z = new D("Hi1", 1)
    == D{def x: Any; def y: Any}
    

    모든 - 유형 매개 변수 T 있기 때문에 두의 최소 공통 상위 유형으로 추정된다.

    기능 단위 (아무것도)을 반환하는 경우 =이 삭제 될 수 있습니다.

    즉, 함수가 하나의 문장 인 경우 {} 함수 몸이 제거 될 수 있지만 문은 값을 반환하는 경우에만 (당신은 = 기호가 필요합니다)

    def returnAString = "Hi!"
    

    하지만이 작동하지 않습니다

    def returnAString "Hi!" // Compile error - '=' expected but string literal found."
    

    이 추정 될 수 있다면 함수의 리턴 타입 (재귀 메소드가 복귀 형 지정한 함)을 생략 할 수있다.

    함수가 어떤 인수를 사용하지 않는 경우 (가), 즉, 삭제할 수 있습니다

    def endOfString {
      return "myDog".substring(2,1)
    }
    

    그에 더 이상 - 관례 이는 부작용이없는 방법을 위해 예약되어 있습니다.

    () 실제로, 자체 이름 매개 변수에 의해 패스를 정의하지만, 실제로는 조용한 의미 다른 표기 인 경우, 즉 삭제되지됩니다

    def myOp(passByNameString: => String)
    

    , myOp은 문자열 결과 패스별로 이름 매개 변수를 작동 반대 (즉, 그 문자열을 반환 코드 블록 일 수있다)를 말한다 얻어

    def myOp(functionParam: () => String)
    

    이는 myOp 제로 매개 변수가 문자열을 반환하는 함수를 취 말한다.

    (마음 당신은 패스에 의해 이름 매개 변수 함수로 컴파일 얻을, 그것은 단지 구문 좋네요을 수 있습니다.)

    함수는 단지 예를 들어, 하나 개의 인수를 취하는 경우 () 함수 파라미터 정의에 삭제 될 수있다

    def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
    def myOp2(passByNameString:Int => String) { .. }
    

    더 이상의 인수를 취하는 경우에, 당신은)이 (가 포함되어야합니다 :

    def myOp2(passByNameString:(Int, String) => String) { .. }
    

    . 단지 이항 연산자 (인수를 운영 방법)에 사용할 수있는 연산자 표기법을 사용하여 제거 될 수있다. 자세한 내용은 다니엘의 답변을 참조하십시오.

    이 표기법은리스트 # 테일과 같은 부작용이없는 방법에 대한 규칙에 의해 예약되어 있기 때문에 (즉, 부작용을 가진 함수의 호출 함수 반환 값을 제외하고, 관측 결과가 없음을 의미 함).

    함수를받는 함수를 호출 할 때, 당신은 예를 들어, 내부 함수 정의에서 ()를 생략 할 수 없습니다

    def myOp3(paramFunc0:() => String) {
        println(paramFunc0)
    }
    myOp3(() => "myop3") // Works
    myOp3(=> "myop3") // Doesn't work
    

    부산물 이름 매개 변수를받는 함수를 호출 할 때, 당신은 매개 변수가없는 익명의 함수로 인수를 지정할 수 없습니다. 예를 들어, 주어진 :

    def myOp2(passByNameString:Int => String) {
      println(passByNameString)
    }
    

    당신은 그것을으로 호출해야합니다 :

    myOp("myop3")
    

    또는

    myOp({
      val source = sourceProvider.source
      val p = myObject.findNameFromSource(source)
      p
    })
    

    하지만:

    myOp(() => "myop3") // Doesn't work
    

    코드를 재사용 할 수 있도록 IMO, 반환 형식을 삭제 남용 유해 할 수 있습니다. 그냥 인해 코드에서 명시적인 정보의 부족으로 감소 가독성의 좋은 예를 들어 사양을 확인합니다. 간접 수준의 수는 실제로 변수의 유형이 너트가 될 수 무엇인지 알아낼 수 있습니다. 잘하면 더 나은 도구는이 문제를 피하고 간결 우리의 코드를 유지할 수 있습니다.

    (OK, 퀘스트에 난 아무것도 또는 잘못받은 뭔가를 놓친 경우 /) 의견을주십시오 부정확, 나는 대답의 시작 부분에 추가 한 (더 완전한, 간결하게 대답을 컴파일합니다. 이것은 언어가 아닙니다 유의하시기 바랍니다 사양, 그래서 그것을 정확히 학문적 정확한 만들려고 아니에요 -. 단지 더 참조 카드처럼)

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

    3.다양한 조건에 대한 통찰력을 제공 따옴표의 모음 ...

    다양한 조건에 대한 통찰력을 제공 따옴표의 모음 ...

    개인적으로, 나는 사양에 이상이있을 거라고 생각했다. 나는이 있어야 확신 해요, 난 그냥 올바른 단어를 검색 아니에요 ...

    이 소스의 몇 그러나, 그리고 나는 그들을 함께 수집했지만, 아무것도 나에게 문제점을 설명하고 그 / 이해 / 종합 / 정말 완벽한 ... :

    제 2 장에서, 프로그래밍 스칼라의 "유형 덜이, 더 많은 일을"

    프로그래밍 스칼라의 : 제 1 장, "스칼라를 소개 제로 육십에"보낸 사람 :

    블로그 게시물 스칼라 구문 프라이머에서 :

    trait Writer {
        def write(str: String)
    }
    object Terminal extends Writer {
        def write(str: String) { System.out.println(str) }
    }
    
    trait Writer {
        def write(str: String): Unit
    }
    object Terminal extends Writer {
        def write(str: String): Unit = { System.out.println(str) }
    }"
    

    언어 사양에서 :

    val firstTen:Range = 0 to 9
    

    자바 난민 6 부 스칼라에서 : 자바 극복 :

    나는 스칼라에 어떤 문자를 생략 할 수 있습니다?

    그러나 또한 나를 혼란은이 말을 인용한다 :

    최대한 멀리 볼 수 있기 때문에, 전화를 수신 할 객체가 ...

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

    4.방법 및 매개 변수 사이의 대체 표현의 공간에서 : 나는 쉽게 엄지 손가락의 규칙을 따라 찾을 수 있습니다. 당신의 예에서, (service.findAllPresentations.get.first.votes.size가) EqualTo가 (2) (service.findAllPresentations.get.first.votes.size) .must로 구문 분석해야합니다 (수) (EqualTo가 (2)). 2 주위의 괄호 공간보다 더 높은 연관성을 가지고 있습니다. 점은 be.equalTo (2) (service.findAllPresentations.get.first.votes.size) .must (be.equalTo (로 구문 분석합니다 높은 연관성 때문에 (service.findAllPresentations.get.first.votes.size)가 2)).

    방법 및 매개 변수 사이의 대체 표현의 공간에서 : 나는 쉽게 엄지 손가락의 규칙을 따라 찾을 수 있습니다. 당신의 예에서, (service.findAllPresentations.get.first.votes.size가) EqualTo가 (2) (service.findAllPresentations.get.first.votes.size) .must로 구문 분석해야합니다 (수) (EqualTo가 (2)). 2 주위의 괄호 공간보다 더 높은 연관성을 가지고 있습니다. 점은 be.equalTo (2) (service.findAllPresentations.get.first.votes.size) .must (be.equalTo (로 구문 분석합니다 높은 연관성 때문에 (service.findAllPresentations.get.first.votes.size)가 2)).

    서비스 findAllPresentations 먼저 표 크기가 EqualTo가 2 구문 분석해야 얻을로 service.findAllPresentations (수) 좁은 방 (투표) 크기는 (반드시) .be (EqualTo가) .2.

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

    5.사실, 두 번째 읽기에, 어쩌면이는 키는 다음과 같습니다

    사실, 두 번째 읽기에, 어쩌면이는 키는 다음과 같습니다

    http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6 : 블로그 게시물에 언급 한 바와 같이.

    그래서 아마도이 실제로 효과적으로 하나 개의 매개 변수를 객체에, 메소드를 호출하는 경우에만 작동하는 매우 엄격한 "구문 설탕"입니다. 예를 들면

    1 + 2
    1.+(2)
    

    다른 아무것도 없습니다.

    이 질문에 내 예를 설명한다.

    내가 말한하지만, 누군가가 언어 스펙이 지정되는 경우, 높이 평가 좋은 것입니다 정확히으로 지적 할 수 있다면.

    언어 사양이 정보가 어디 있는지 확인, 멋진 동료는 (#scala에서 paulp_) 지적했다 :

    흠 - 나에게 내가보고 있어요 아니면 내가 그냥 이해하지 못하는 것과 메쉬하지 않습니다)

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

    6.어떤이 없습니다. 당신은 가능성이 기능은 부작용이 있는지 여부를 주위에 조언을 받게됩니다. 이 가짜입니다. 보정 스칼라 허용하는 적당한 정도로 부작용을 사용하지 않는 것이다. 그렇지 수있는 범위 내에서, 모든 베팅은 꺼져 있습니다. 모든 베팅. 괄호를 사용하여 설정 "모든"의 요소이며 불필요한입니다. 모든 베팅이 꺼져 일단 그것은 어떤 가치를 제공하지 않습니다.

    어떤이 없습니다. 당신은 가능성이 기능은 부작용이 있는지 여부를 주위에 조언을 받게됩니다. 이 가짜입니다. 보정 스칼라 허용하는 적당한 정도로 부작용을 사용하지 않는 것이다. 그렇지 수있는 범위 내에서, 모든 베팅은 꺼져 있습니다. 모든 베팅. 괄호를 사용하여 설정 "모든"의 요소이며 불필요한입니다. 모든 베팅이 꺼져 일단 그것은 어떤 가치를 제공하지 않습니다.

    (: 다른 효과 시스템보다 덜 유용과 혼동하지 말 것)이 조언은 본질적으로 실패 이펙트 시스템에서 시도이다.

    부작용을하지보십시오. 그 후, 모든 베팅이 꺼져 있다는 것을 동의합니다. 효과 시스템을위한 사실상의 구문 표기법 뒤에 숨기기 및 만 해를 일으키는 원인 않습니다 수 있습니다.

  7. from https://stackoverflow.com/questions/1181533/what-are-the-precise-rules-for-when-you-can-omit-parenthesis-dots-braces-f by cc-by-sa and MIT license