scala 3中的^有什么作用?

ebdffaop  于 2023-04-30  发布在  Scala
关注(0)|答案(1)|浏览(120)

我刚开始使用scala 3,在玩的时候我发现,有一个“^”运算符。
我只是不知道它是做什么的,它产生的输出也不能真正说明问题。
我试着在谷歌或文档中找到它,但除了一个提到我找不到任何东西。
https://docs.scala-lang.org/tour/operators.html
我也试着理解输出,也许你可以更好地理解它:

@main def foo() :Unit = {
  var i = 0
  while i < 10 do {
    println(s"$i -> ${i^2}")
    i += 1
  }
}

输出:

0 -> 2
1 -> 3
2 -> 0
3 -> 1
4 -> 6
5 -> 7
6 -> 4
7 -> 5
8 -> 10
9 -> 11

在^之后使用i从0到5的不同数字的更多输出:
| 我|^2|^3|^4|^5|
| --------------|--------------|--------------|--------------|--------------|
| 0|二|三|四|五|
| 1|三|二|五|四|
| 二|0|1|六|七|
| 三|1|0|七|六|
| 四|六|七|0|1|
| 五|七|六|1|0|

fcg9iug3

fcg9iug31#

在scala中,没有类似运算符的东西。你有对象,这些对象有方法。在scala的官方文档中,它谈到了operators
在Scala中,运算符是方法。任何带有单个参数的方法都可以用作中缀运算符。例如,+可以用点表示法调用:
方法可以用如下的任何名称命名(当然还有naming conventions

object DifferentNamesForMethods {
  def +(i: Int) = ???
  def $(i: Double) = ???
  def `class`(a: String, b: Boolean = ??? // you can use reserved words but you need to put them between backtics
  def `a name with spaces`(x: List[Int) = ???
}

当你正在做:

val a = b + c

你所做的就是

val a = b.+(c)

这意味着,您正在调用名为+的对象的方法(对于*-/相同)。回到你的问题,基于你的例子

@main def foo() :Unit = {
  var i = 0
  while i < 10 do {
    println(s"$i -> ${i^2}") // here is where the `^`is being used
    i += 1
  }
}

已知变量i的类型为Int,您将从abstract final classInt extends AnyVal调用名为^的方法。正如你在方法的描述中所看到的:Returns the bitwise XOR of this value and x.,这意味着您正在对象Int的示例和ˆ方法中接收的参数之间进行位级XOR运算。这将被翻译为

println(s"$i -> ${i.^(2)}")

这就是为什么你得到这些输出。如果你使用的是IDE,它应该显示方法的scaladoc,甚至你可以浏览代码。

离题

您共享的代码片段可以以更实用的方式重写,而无需使用可以变异的变量

@main def foo() :Unit = {
  (1 until 10).foreach(i => println(s"$i -> ${i^2}"))
}

相关问题