Я только начал со scala 3 и, играя, узнал, что есть оператор "^".
Я просто понятия не имею, что он делает, и результаты, которые он производит, тоже ничего не говорят.
Я пытался найти его в Google или в документах, но, кроме одного упоминания, ничего не нашел.
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:
Это не только из scala 3. Scala 2 делает то же самое Int^
Итак, нет точного оператора, подобного другим языкам, таким как Java. Вы также можете определить метод с именем ^
в своем пользовательском классе, а затем вызвать его. Что ^
собирается делать, зависит от объекта
Абсолютно верно @GastónSchabas, мне плохо, потому что я не потратил достаточно времени, чтобы найти лучшую дублированную ссылку.
См. абстрактное определение ^(x: Int): Int
@GastónSchabas: мы не можем показать этот вопрос с двойным циркумфлексом как повторяющуюся цель, потому что в нем отсутствует ответ, за который проголосовали. Я думаю, что на это следует ответить, если не доступна действительная цель дублирования.
В scala нет ничего похожего на операторы. У вас есть объекты, а у этих есть методы. В официальных документах scala, где говорится о операторах, говорится
В Scala операторы — это методы. В качестве инфиксного оператора можно использовать любой метод с одним параметром. Например, + можно вызвать с точечной нотацией:
Методы могут быть названы любым именем, как показано ниже (конечно, существуют соглашения об именах)
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
, вы вызываете метод с именем ^ из абстрактного конечного classInt extends AnyVal. Как видно из описания метода: Returns the bitwise XOR of this value and x.
, что означает, что вы делаете операцию XOR на битовом уровне между экземпляром объекта Int и параметром, полученным в методе ˆ
. Это будет переведено как
println(s"$i -> ${i.^(2)}")
Вот почему вы получаете эти результаты. Если вы используете IDE, она должна показать вам scaladoc метода, или даже вы сможете просмотреть код.
не по теме
фрагмент кода, которым вы поделились, может быть переписан более функциональным способом без использования переменных, которые можно видоизменять
@main def foo() :Unit = {
(1 until 10).foreach(i => println(s"$i -> ${i^2}"))
}
Вопрос помечен как дубликат с неправильной ссылкой. Когда вы ставите что-то после Int, вы вызываете метод класса Int. То же самое происходит почти со всем. Итак, в зависимости от того, какой экземпляр у вас слева, будет выполняться метод. В случае с Int выполняется операция XOR Int ^