gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:18:36 24 4
gpt4 key购买 nike

初学者 Scala 问题,但我在这里找不到答案。

与 C++ 中的重载类似,我希望编译器可以区分名为 - 的方法之间的区别。它接受一个参数(与类具有相同的类型)和 - 的一元版本没有参数,为什么是 unary_需要吗?

最佳答案

unary_一元前缀运算符的前缀有点误导:它更多的是关于前缀部分而不是一元部分。你需要一些方法来区分

!foo // unary prefix !


foo! // unary postfix !

请记住:Scala 实际上没有运算符。有两种方法可以调用方法,一种是使用 .或有空格:
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_! .

关于scala - 为什么Scala中需要 `unary_`前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16644988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com