加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么在scala中需要`unary_`前缀?

发布时间:2020-12-16 09:47:48 所属栏目:安全 来源:网络整理
导读:初学者Scala问题,但我在这里找不到答案。 类似于C中的重载,我希望编译器可以告诉一个方法调用 – 它接受一个参数(与类的相同类型)和一元版本 – 它不需要参数之间的区别,为什么是unary_需要? 解决方法 一元前缀运算符的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_ !.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读