Что делает ^ в scala 3?

Я только начал со 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:

я ^2 ^3 ^4 ^5 0 2 3 4 5 1 3 2 5 4 2 0 1 6 7 3 1 0 7 6 4 6 7 0 1 5 7 6 1 0

Вопрос помечен как дубликат с неправильной ссылкой. Когда вы ставите что-то после Int, вы вызываете метод класса Int. То же самое происходит почти со всем. Итак, в зависимости от того, какой экземпляр у вас слева, будет выполняться метод. В случае с Int выполняется операция XOR Int ^

Gastón Schabas 25.04.2023 21:28

Это не только из scala 3. Scala 2 делает то же самое Int^

Gastón Schabas 25.04.2023 21:30

Итак, нет точного оператора, подобного другим языкам, таким как Java. Вы также можете определить метод с именем ^ в своем пользовательском классе, а затем вызвать его. Что ^ собирается делать, зависит от объекта

Gastón Schabas 25.04.2023 21:34
Эта тема - оператор двойного циркумфлекса в scala может быть более точной ссылкой для отображения как дубликат
Gastón Schabas 25.04.2023 21:37

Абсолютно верно @GastónSchabas, мне плохо, потому что я не потратил достаточно времени, чтобы найти лучшую дублированную ссылку.

Gaël J 25.04.2023 23:02

См. абстрактное определение ^(x: Int): Int

Mark Rotteveel 26.04.2023 17:43

@GastónSchabas: мы не можем показать этот вопрос с двойным циркумфлексом как повторяющуюся цель, потому что в нем отсутствует ответ, за который проголосовали. Я думаю, что на это следует ответить, если не доступна действительная цель дублирования.

hardmath 29.04.2023 21:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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}"))
}

Другие вопросы по теме