Syntax Scala&x27的列表;s";“魔术”;功能
在哪里可以找到Scala的“神奇”功能列表,如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
应用
,取消应用
,更新
,+=
,等等
所谓神奇函数,我指的是编译器的一些语法糖所使用的函数,例如
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");