Scala의 암시적 변환

10262 단어 scalafunctional
Scala (내가 쓰는 동안 버전 2.13에서)는 implicits system 을 기반으로 하는 강력한 변환 시스템을 가지고 있습니다.

암시적 메서드와 클래스를 더 복잡한 구조로 확장하여 작동하므로 명시적으로 수행해야 하는 경우 코딩하기가 훨씬 더 어렵습니다.



암시적 변환과 그 확장을 구현하는 세 가지 방법에 대해 이야기하겠습니다.

암시적 방법



이중 값 시퀀스를 취하십시오.

Seq(0.4, 1.8, 2.2)


이 경우 짧은 목록이지만 수백 개가 될 수 있습니다. 천장 정수 값만 필요하므로 값을 변환하는 방법이 필요합니다.

암시적 방법을 사용할 수 있습니다.

implicit def double2int(value: Double): Int = value.ceil.toInt

val values: Seq[Int] = Seq(0.4, 1.8, 2.2)

values의 값은 다음과 같습니다.

Seq(1, 2, 3)


다음과 같이 확장됩니다.

def double2int(value: Double): Int = value.ceil.toInt

val values: Seq[Int] = Seq(0.4, 1.8, 2.2) map double2int


암시적 클래스



암시적 클래스는 기존 형식에 메서드를 주입하는 방법입니다.

예를 들어 XML 노드를 생성하는 문자열 메서드를 만들어 보겠습니다.

implicit class XMLString(value: String) {
  def toXML: Option[NodeSeq] = Try(XML loadString value).toOption
}

val source = getDataFromOutsideSource() // : String

val node = source.toXML


다음으로 확장됩니다.

class XMLString(value: String) {
  def toXML: Option[NodeSeq] = Try(XML loadString value).toOption
}

object XMLString extends (String => XMLString) {
  def apply(value: String): XMLString = new XMLString(value)
}

val source: String = getDataFromOutsideSource()

val node: Option[NodeSeq] = XMLString(source).toXML

.toXML가 호출될 때마다 새로운 XMLString가 생성됩니다.

암시적 값 클래스



Value classes은 호출할 때마다 새 인스턴스를 생성하지 않는 경량 Scala 리소스입니다. 대신 모든 값 클래스는 동반 개체를 사용하여 메서드를 감싸고 여기에서 호출합니다.

double이 정수인지 여부를 확인하는 방법인 다음 예제를 고려하십시오.

implicit class IntegralDouble(val value: Double): extends AnyVal {
  def isIntegral: Boolean = value % 1 == 0
}

val value = getSomeFloatPointValue() // : Double

if (value.isIntegral)
  doSomeMathWith(value)


다음으로 확장됩니다.

class IntegralDouble(val value: Double): extends AnyVal {
  def isIntegral: Boolean = IntegralDouble isIntegral$expansion value
}

object IntegralDouble {
  def isIntegral$expansion(value: Double): Boolean = value % 1.0 == 0.0
}

val value: Double = getSomeFloatPointValue()

if (IntegralDouble.isIntegral$expansion(value))
  doSomeMathWith(value)

.isIntegral 호출 시 인스턴스가 생성되지 않습니다.

참고: 값 클래스는 AnyVal 를 상속하여 태그가 지정되며 * <: AnyVal 유형의 값이 필요합니다. ) , Boolean , Byte 및 그들의 literal-based singleton types .


Kodumaro의 원본 게시물 .

좋은 웹페이지 즐겨찾기