为什么在scala中需要`unary_`前缀?
初学者Scala问题,但我在这里找不到答案。
类似于C中的重载,我希望编译器可以告诉一个方法调用 – 它接受一个参数(与类的相同类型)和一元版本 – 它不需要参数之间的区别,为什么是unary_需要? 解决方法
一元前缀运算符的unary_前缀是有点误导:它是更多的前缀部分比一元部分。你需要一些方法来区分
!foo // unary prefix ! 从 foo! // unary postfix ! 记住:Scala实际上没有运算符。有两种方法来调用一个方法,要么用a。或与空格: foo.bar(1,"two") foo bar(1,"two") 当你有一个参数,你可以离开括号: foo plus(1) foo plus 1 最后,(几乎)任何字符在标识符中是合法的: foo plus 1 foo + 1 现在看起来Scala有一个二进制中缀运算符,但实际上不是。它只是一个用正常方法调用语法调用的普通方法。 然而,我上面说的不完全正确。如果Scala没有对操作符的支持,这一切都只是正常的方法调用,那么 2 + 3 * 4 将评估为20(像在Smalltalk,Self和Newspeak中的例子)而不是14.所以,有一点支持Scala中的操作符(实际上两个小位)。当使用空格(所谓的“运算符语法”)而不是。调用方法,并且该方法以运算符字符开始时,则Scala将遵守运算符优先级。 而运算符支持的另一个小点是,你有一些操作符,你想要有,但不能轻易表达为方法调用。它适用于二进制中缀运算符和一元后缀运算符: foo op bar // same as: foo.op(bar) foo op // same as: foo.op 但不是为前缀或“around-fix”运算符: !foo foo(bar) 所以,有一些特殊的语法糖翻译规则: !foo foo.unary_! // same for +,- and ~ foo(bar) foo.apply(bar) foo(bar) = 1 foo.update(bar,1) foo += 1 foo.+=(1) // but if this doesn't compile,then the compiler will also try foo = foo.+(1) 在方法名称中字母数字和“运算符”部分之间需要有下划线的原因是因为您不知道 foo! 手段 foo.! 要么 this.foo! 因此,foo!因为方法名是非法的,所以需要调用foo_ !. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |