Scala 메서드 선언에서 등호를 언제 사용해야합니까?


85

등호 사용 :

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

등호없이 :

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

위의 두 프로그램은 모두 동일한 방식으로 실행됩니다. Scala에서 내가 싫어하는 블로그 게시물 에서 등호가 없으면 메소드가 Unit(Java와 동일 void) 반환되므로 값을 반환하는 메소드는 등호를 사용해야한다고 읽었습니다 . 그러나 값을 반환하지 않는 메서드는 어느 쪽이든 작성할 수 있습니다.

값을 반환하지 않는 Scala 메서드에서 등호를 사용하는 가장 좋은 방법은 무엇입니까?

답변:


108

나는 실제로 다니엘에게 매우 동의하지 않습니다. 나는 비와 동일한 구문을해야한다고 생각 절대 사용하지. 메서드가 API로 노출되고 실수로 잘못된 유형을 반환 할 우려가있는 경우 명시 적 유형 주석을 추가합니다.

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

같지 않은 구문은 더 짧고 "더 깔끔하게"보일 수 있지만 혼란의 가능성을 추가한다고 생각합니다. 나는 때때로 등호를 추가하는 것을 잊고 실제로 Unit을 반환 할 때 내 메서드가 값을 반환한다고 믿었습니다. 비동 등 및 동일 유형의 유추 유형 구문이 시각적으로 유사하기 때문에이 문제를 놓치기 쉽습니다.

약간의 작업 비용이 들지만 중요한 경우 명시 적 유형 주석 (즉, 노출 된 인터페이스)을 선호합니다.


1
저는이 접근 방식이 마음에 들어서 더 명확하고 독자에게 더 명확합니다.
Lukasz Korzybski

4
분명히 그것은 이제 권장되는 스타일 ( docs.scala-lang.org/style/declarations.html#procedure_syntax )이므로 허용되는 답변으로 변경하겠습니다.
Esko Luontola

1
본인은 =이없는 구문이 언어에서 모두 제거해야한다고 생각, 그것도 동의
아흐메드 솔리 Farghal을

7
Martin Odersky는 그의 기조 연설 "Scala with Style"에서 이것은 역사적 실수라고 말했다. 그는 자바 개발자가 혼동하지 않도록 "Unit"을 숨길 수 있도록이 구문 (=없이)을 추가해야했습니다. 또한 그는 향후 제거 될 것이라고 언급했습니다.
tabdulradi 2014

2
메서드 정의에서 등호를 잊은 경우 경고하는 방법이 있습니까? 예를 들어 컴파일러 옵션 또는 소스 분석 도구로?
VasiliNovikov 2014 년

42

업데이트 : Scala-2.10부터 등호를 사용하는 것이 좋습니다. 이전 답변 :

반환하는 메서드 Unit항상 같지 않은 구문을 사용해야합니다. 이렇게하면 구현시 API로 넘어갈 수있는 잠재적 인 실수를 방지 할 수 있습니다. 예를 들어 실수로 다음과 같은 작업을 수행했을 수 있습니다.

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

물론 사소한 예이지만 이것이 어떻게 문제가 될 수 있는지 알 수 있습니다. 마지막식이 반환 되지 않기 때문에 Unit메서드 자체는 Unit. 이는 공용 API에 노출되며 향후 다른 문제를 일으킬 수 있습니다. 같지 않은 구문을 사용하면 마지막 표현식이 무엇인지는 중요하지 않습니다. Scala는 반환 유형을 Unit.

또한 두 글자 더 깨끗합니다. :-) 나는 또한 non-equals 구문이 코드를 읽기 쉽게 만든다고 생각하는 경향이 있습니다. 문제의 메서드가 Unit유용한 값보다 반환된다는 것이 더 분명합니다 .

관련 메모에서 추상 메서드에 대한 유사한 구문이 있습니다.

trait Foo {
  def bar(s: String)
}

메서드 bar에는 서명이 String=>Unit있습니다. 스칼라는 추상 멤버에 대한 유형 주석을 생략 할 때이를 수행합니다. 다시 한 번, 이것은 더 깨끗하고 (내 생각에) 더 읽기 쉽습니다.


3
등호를 사용하지 않는 것도 Scala 스타일 가이드의 권장 사항입니다. davetron5000.github.com/scala-style/types/inference/…
Esko Luontola

6
내가 그 비트를 썼으므로 참조를 계량 할 때 염두에 두어야 할 것입니다. :-)
Daniel Spiewak

LoL, 그래서 나는 나의 불쌍한 발언으로 인해 "비트"가 "개년"으로 나왔다는 것을 제외 하고는이 작은 교환을 내 여자 친구에게 설명했습니다. 말할 것도없이 코미디가 이어졌다.
Saem

10
ScalaDays 2013, Martin Odersky, Keynote-Scala with Style 장 45 : 프로 시저 선언 (같지 않은 구문)은 피해야합니다.
senia

4
공식 스타일 가이드는 더 이상 이것을 권장하지 않습니다 : docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein 2013

12

당신은 해야한다 단위를 반환 정의를 제외하고 호출 선언에서 등호 기호를 사용합니다.

후자의 경우 등호를 무시할 수 있습니다 . 이 구문은 더 이상 사용되지 않을 수 있으므로 피하는 것이 가장 좋습니다. 등호를 사용하고 반환 유형을 선언하면 항상 작동합니다.


책, 메일 링리스트, 소스 코드. 그건 그렇고, 그 이후로 후자의 구문은 더 이상 사용되지 않을 것 같으며 많은 사람들이 선호한다는 것이 분명해졌습니다.
Daniel C. Sobral 2013-06-24

1
docs.scala-lang.org/style/types.html#function_values 유형 스타일 가이드가 어쨌든 = 항상 사용을 나타내는 것처럼 보입니다.
BeepDog

4

메서드의 경우 Scala Style Guide 는 프로 시저 구문이 아닌 equals 구문을 권장합니다.

절차 구문

프로 시저 구문은 간결함을 얻기 위해 혼동되는 경향이 있으므로 피하십시오.

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

0

한 가지 : Unit을 반환해야하는 메서드의 마지막 문장이 Unit을 반환하지 않는다고 상상해보십시오. 같지 않은 구문을 사용하는 것이 매우 편리합니다. 여러 사용 사례를 볼 때 더 이상 사용되지 않기를 바랍니다.


0

시간이 지남에 따라 기본 스타일이 변경되었으며 답변에 대한 많은 주석에서 언급되었으므로 공식 스타일 가이드 에서 =함수 선언에 구문 을 사용하는 것이 좋습니다 .


1
제공 한 링크는 절차 (즉, Unit을 반환하는 함수)가 아닌 함수에 대해서만 설명합니다.
Esko Luontola 2014 년

맞아요, @EskoLuontola, 죄송합니다. 제가 열어 본 많은 탭 중 하나에서 잘못된 링크를 복사 한 것 같습니다. 업데이트되었습니다.
BeepDog

0

반환 값이없는 메서드의 경우 이러한 메서드를 표현하는 방법은 중괄호로 묶인 블록이있는 메서드 다음에 결과 유형과 등호를 생략하는 것입니다. 이 형식에서 메서드는 부작용에 대해서만 실행되는 메서드 인 프로 시저처럼 보입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.