스칼라 접두사 표기법


12

접두사 표기법을 사용하여 메소드를 호출 할 수 있습니까?

예를 들어, Haskell에서 다음 함수를 작성할 수 있습니다.

x `isAFactorOf` y = x % y == 0

그런 다음 다음과 같이 사용하십시오.

if 2 `isAFactorOf` 10 ...

어떤 경우에는 매우 읽기 쉬운 코드를 허용합니다. 스칼라에서도 이와 비슷한 것이 있습니까? "Scala infix 표기법"을 검색했지만 그 용어는 스칼라에서 다른 의미를 갖는 것 같습니다.

답변:


15

버전 2.10부터 Scala는이 문제를 정확하게 처리하기 위해 암시 적 클래스를 도입했습니다.

이렇게하면 주어진 유형에서 래핑 된 클래스로의 암시 적 변환이 수행되며 여기에는 고유 한 메서드와 값이 포함될 수 있습니다.

특정 경우에는 다음과 같이 사용하십시오.

implicit class RichInt(x: Int) {
  def isAFactorOf(y: Int) = x % y == 0
}

2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10

컴파일 할 때 원시 값을에 넣습니다 RichInt(2). RichInt를 다음과 같은 하위 클래스로 선언하면이 문제를 해결할 수 있습니다 AnyVal.

implicit class RichInt(val x: Int) extends AnyVal { ... }

이로 인해 권투가 발생하지는 않지만 일반적인 암시 적 클래스보다 제한적입니다. 값이나 상태가 아닌 메소드 포함 할 있습니다.


2
암시 적 클래스는 최상위 수준이 될 수 없으므로 암시 적 클래스는 로컬로 정의해야합니다.
Carcigenicate

3

기본적으로 스칼라에서는 함수를 삽입 방식으로 호출 할 수 없지만, 왼쪽 인수를 암시 적으로 변환 할 수있는 유형에 대한 메소드를 정의 할 수 있습니다. 예를 들어, isAFactorOf (Int 사용) 메소드가있는 클래스를 정의하고 Int를 내재적으로이 클래스의 인스턴스로 변환 할 수 있음을 나타낼 수 있습니다.

다른 질문에 대한 이 답변 https : //.com/a/3119671 을 보면 Scala의 구문이 동일하게 작동합니다.


스칼라의 새로운 버전은 이것을 위해 명시 적으로 구성을 가지고 있음을 지적 할 가치가 implicit class RichInt(i: Int) { def square() = i * i }있습니다.
KChaloux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.