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>= B
로 A = 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
및 인수 목록에 대한 메서드 호출 을 허용 합니다 .args
x.field
field
호출이에서 기본적으로 지원되지 않는
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
'Programing' 카테고리의 다른 글
훈련 중 nans의 일반적인 원인 (0) | 2020.10.30 |
---|---|
템플릿 typedefs-해결 방법은 무엇입니까? (0) | 2020.10.30 |
Where should I use defrecord in clojure? (0) | 2020.10.30 |
NULL 포인터가 C와 C ++에서 다르게 정의되는 이유는 무엇입니까? (0) | 2020.10.30 |
접두사가없는 targetNamespace 및 xmlns, 차이점은 무엇입니까? (0) | 2020.10.30 |