Programing

Scala의 "마법"기능 목록

lottogame 2020. 10. 30. 07:40
반응형

Scala의 "마법"기능 목록


어디에서, 스칼라의 "마법"함수의 목록을 찾을 수있는 등 apply, unapply, update, +=, 등?

매직 함수 란 컴파일러의 일부 구문 설탕에서 사용되는 함수를 의미합니다.

o.update(x,y) <=> o(x) = y

의 일부 scala magic및 동의어 조합을 검색 functions했지만 아무것도 찾지 못했습니다.

나는 표준 라이브러리에서 매직 함수 사용관심이 없지만 매직 함수가 존재합니다.


내가 아는 한:

게터 / 세터 관련 :

apply
update
identifier_=

패턴 매칭 :

unapply
unapplySeq

이해력 :

map
flatMap
filter
withFilter
foreach

접두사 연산자 :

unary_+
unary_-
unary_!
unary_~

그 외에도, B. 스칼라에 대한 어떠한 암시도 변환 할 A <op>= BA = A <op> B전 연산자가 정의되지 않은 경우, "OP"는 영숫자없고, <op>=없는 !=, ==, <=또는 >=.

그리고 Scala의 모든 구문 설탕이 나열되는 곳이 하나도 없다고 생각합니다.


update이외에도 apply마법적인 것으로 간주되는 여러 단항 연산자가 있습니다.

  • unary_+
  • unary_-
  • unary_!
  • unary_~

여기에 일반 중위 / 접미사 연산자 (거의 모든 것이 될 수 있음)를 추가하면 완전한 패키지가 완성됩니다.

Scala 언어 사양을 실제로 살펴 봐야합니다. 이것에 대한 유일한 권위있는 출처입니다. 읽기가 어렵지 않으며 (문맥없는 문법에 익숙하다면) 매우 쉽게 검색 할 수 있습니다. 잘 지정하지 않는 유일한 것은 XML 지원입니다.


귀하의 질문에 정확히 대답하지 않으면 죄송하지만 지금까지 제가 가장 좋아하는 WTF 순간은 @ 패턴 일치 내부 할당 연산자입니다. "Programming in Scala"의 소프트 카피 덕분에 나는 그것이 꽤 빨리 무엇인지 알아 냈다.

@를 사용하여 패턴의 모든 부분을 변수에 바인딩 할 수 있으며 패턴 일치가 성공하면 변수가 하위 패턴의 값을 캡처합니다. 다음 은 스칼라 프로그래밍 의 예입니다 (섹션 15.2-변수 바인딩) :

expr match {
  case UnOp("abs", e @ UnOp("abs", _)) => e
  case _ =>
}

전체 패턴 일치가 성공하면 UnOp ( "abs", _) 부분과 일치하는 부분을 변수 e로 사용할 수 있습니다.

그리고 여기 '무슨이다 스칼라 프로그래밍하는 것은 그것에 대해 말한다.

해당 링크는 더 이상 작동하지 않습니다. 여기 에 있습니다.


또한 다음 과 같은 임의의 수의 매개 변수에_* 대한 패턴 일치를 추가 합니다.

case x: A(_*)

그리고 운영자 연관성 규칙, Odersky - 넓적 Venners 책에서 :

Scala에서 연산자의 연관성은 마지막 문자에 의해 결정됩니다. <...>에서 언급했듯이 ':'문자로 끝나는 모든 메서드는 오른쪽 피연산자에서 호출되어 왼쪽 피연산자를 전달합니다. 다른 문자로 끝나는 메서드는 그 반대입니다. 왼쪽 피연산자에서 호출되어 오른쪽 피연산자를 전달합니다. 따라서 a * b는 a. * (b)를 산출하지만 a ::: b는 b.:::(a)를 산출합니다.


여기 에서 찾을 수있는 for 표현 의 구문 적 desugaring도 언급해야 합니다.


그리고 (물론!) 쌍에 대한 대체 구문

a -> b //converted to (a, b), where a and b are instances

(정확히 지적했듯이, 이것은 라이브러리를 통해 수행 암시 적 변환뿐이 므로 적합하지 않을 수 있지만 초보자에게는 일반적인 퍼즐입니다.)



그들은 Scala 언어 사양에 정의되어 있습니다. 내가 아는 한, 당신이 언급했듯이 단지 세 가지 "마법"기능이 있습니다.

Scalas Getter 및 Setter는 "마법"과 관련 될 수도 있습니다.

scala> class Magic {
 |     private var x :Int = _
 |     override def toString = "Magic(%d)".format(x)
 |     def member = x
 |     def member_=(m :Int){ x = m }
 | }

defined class Magic

scala> val m = new Magic

m: Magic = Magic(0)

scala> m.member

res14: Int = 0

scala> m.member = 100

scala> m

res15: Magic = Magic(100)

scala> m.member += 99

scala> m

res17: Magic = Magic(199)

"마법"특성도 있다고 덧붙이고 싶습니다.- scala.Dynamic:

동적 호출을 가능하게하는 마커 특성. x이 특성의 인스턴스 임의의 필드 이름에 대한 필드 액세스뿐만 아니라 x.meth(args)임의의 메서드 이름 meth및 인수 목록에 대한 메서드 호출 허용 합니다 .argsx.fieldfield

호출이에서 기본적으로 지원되지 않는 x경우 (예 : 유형 검사가 실패한 경우) 다음 규칙에 따라 다시 작성됩니다.

foo.method("blah")      ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah")  ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2)    ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field           ~~> foo.selectDynamic("field")
foo.varia = 10      ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13    ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10)         ~~> foo.applyDynamic("arr")(10)

Scala 2.10부터이 특성의 직접 또는 간접 하위 클래스를 정의하는 것은 언어 기능 역학이 활성화 된 경우에만 가능합니다.

So you can do stuff like

import scala.language.dynamics

object Dyn extends Dynamic {
  def applyDynamic(name: String)(a1: Int, a2: String) {
    println("Invoked " + name + " on (" + a1 + "," + a2 + ")");
  }
}

Dyn.foo(3, "x");
Dyn.bar(3, "y");

참고URL : https://stackoverflow.com/questions/1483212/list-of-scalas-magic-functions

반응형