Syntax Scala&x27的列表;s";“魔术”;功能

Syntax Scala&x27的列表;s";“魔术”;功能,syntax,scala,Syntax,Scala,在哪里可以找到Scala的“神奇”功能列表,如应用,取消应用,更新,+=,等等 所谓神奇函数,我指的是编译器的一些语法糖所使用的函数,例如 o.update(x,y) <=> o(x) = y 更新(x,y)o(x)=y 我在谷歌上搜索了scalamagic和函数的同义词的组合,但什么也没找到 我对标准库中魔法函数的用法不感兴趣,但对魔法函数存在的地方不感兴趣。它们是在Scala语言规范中定义的。 据我所知,正如你提到的,只有三个“神奇”功能 Scalas Getter和Sett

在哪里可以找到Scala的“神奇”功能列表,如
应用
取消应用
更新
+=
,等等

所谓神奇函数,我指的是编译器的一些语法糖所使用的函数,例如

o.update(x,y) <=> o(x) = y
更新(x,y)o(x)=y 我在谷歌上搜索了
scala
magic
函数的同义词的组合,但什么也没找到


我对标准库中魔法函数的用法不感兴趣,但对魔法函数存在的地方不感兴趣。

它们是在Scala语言规范中定义的。 据我所知,正如你提到的,只有三个“神奇”功能

Scalas Getter和Setter也可能与您的“魔力”有关:


除了
更新
应用
之外,还有一些一元运算符(我相信)具有魔力:

  • 一元数
  • 一元
  • 一元
  • 一元~
再加上常规的中缀/后缀操作符(几乎可以是任何东西),您就拥有了完整的包

您真的应该看看Scala语言规范。这是关于这件事的唯一权威来源。它不难阅读(只要你对上下文无关的语法感到满意),而且很容易搜索。它唯一没有很好地指定的是XML支持。

据我所知:

与getter/setter相关的:

apply
update
identifier_=
模式匹配:

unapply
unapplySeq
对于理解:

map
flatMap
filter
withFilter
foreach
前缀运算符:

unary_+
unary_-
unary_!
unary_~
除此之外,从A到B的任何隐式。Scala还将
A=B
转换为
A=AB
,如果未定义前一个运算符,“op”不是字母数字,
=
不是
=
=
=


而且我不相信有任何一个地方可以列出Scala的所有语法糖。

如果它不能准确回答您的问题,很抱歉,但我最喜欢的WTF时刻是@as赋值操作符inside pattern match。多亏了“Scala编程”的软拷贝,我很快就发现了它是什么

使用@we可以将模式的任何部分绑定到变量,如果模式匹配成功,变量将捕获子模式的值。下面是Scala中编程的示例(第15.2节-变量绑定):

如果整个模式匹配成功, 然后是与 UnOp(“abs”)部分可用 作为变量e

这就是编程Scala所说的


这种联系不再有效。是这样的。

我还将添加
\u*
,用于对任意数量的参数进行模式匹配,如

和运算符关联性规则,摘自Odersky Spoon-Venners手册:

Scala中运算符的结合性由其最后一个 性格如上所述,任何结束 在“:”中,在其右操作数上调用字符,并传入 左操作数。以任何其他字符结尾的方法是另一个 到处都是。它们在其左操作数上被调用,传入 右操作数。所以a*b产生a.*(b),但a:::b产生b:::(a)


也许我们还应该提到可以找到的表达式的语法去修饰


还有(当然!),成对的替代语法

(正如正确指出的,这只是通过库进行的隐式转换,因此可能不符合条件,但我发现这是新来者常见的难题)



我想补充一点,还有一个“神奇”的特质-:

支持动态调用的标记特性。此特性的实例
x
允许对任意方法名
meth
和参数列表
args
调用
x.field
,以及对任意字段名
field
的字段访问
x.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)
从Scala2.10开始,只有启用了语言特性动态,才能定义此特性的直接或间接子类

所以你可以做像这样的事情

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");

如果你能为我挖掘证据证明这一说法,你将回答我的问题;-)我以为它会出现在规范中,但在规范中找到它们并不是一件有趣的工作。。。如果x是某个模板中定义的无参数函数,并且同一模板包含一个setter函数x_=作为成员,则赋值x=e被解释为该setter函数的调用x_=(e)。类似地,对无参数函数x的赋值f.x=e被解释为调用f.x_=(e)。赋值f(args)=e且函数应用程序位于“=”运算符的左侧,将被解释为f.update(args,e),即调用由f.i.元素定义的更新函数,这是没有更多的证据。您可能希望添加其他帖子中列出的一元运算符等,因为这似乎是对以下问题最详尽的回答:)什么是
标识符=
?从未见过。@StefanEndrullis尝试一下:
object X{var\ux=0;def X_u=(n:Int){ux=n};def X=\ux};X.X=5;println(X.X)
@Daniel C.Sobral:啊,好吧,
标识符
只是一个占位符。明白了。谢谢。还有
==
调用的
equals
,你能和我们分享一下@operator的功能吗?IIRC
->
只是一个库函数。
case x: A(_*)
a -> b //converted to (a, b), where a and b are instances
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)
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");