Функция toString в Scala

#scala

#scala

Вопрос:

Я новичок в Scala, я читал о scala из следующего источника: http://docs.scala-lang.org/tutorials/tour/classes

У нее был следующий код:

 class Point(var x: Int, var y: Int) {
  def move(dx: Int, dy: Int): Unit = {
    x = x   dx
    y = y   dy
  }
  override def toString: String =
    "("   x   ", "   y   ")"
}
object Classes {
  def main(args: Array[String]) {
    val pt = new Point(1, 2)
    println(pt)
    pt.move(10, 10)
    println(pt)
  }
}
  

Вывод:

 (1, 2)
(11, 12)
  

Я хотел спросить, как println(pt) функция напечатала результат (1,2) ? Разве мы не должны вызывать pt.toString() для печати результата, как показано?

Ответ №1:

Существует перегрузка println , которая принимает значение типа Any Predef.scala):

 def println(x: Any) = Console.println(x)
  

Глубоко внутри он вызывает x.toString() , чтобы получить строку для печати.

Комментарии:

1. Что, если мы используем другое имя для метода toString, скажем, toString, но который делает то же самое, будет ли println знать, как теперь печатать объект?

2. Нет — toString переопределяет Java Object.toString , который является методом, вызываемым в конечном println итоге . Если вы не переопределите ее — будет использоваться реализация по умолчанию (которая печатает имя класса и адрес памяти), а НЕ какой-либо другой метод, который вы создаете.

3. Где я могу найти реализацию функции prinln()?

4. Начните здесь: github.com/scala/scala/blob/2.12.x/src/library/scala /… — затем вам придется перейти к Console.scala, PrintStream.java и String.java

5. Обратите внимание, что Scala наследует эту функцию от Java, где System.out.println(obj); также будет вызывать toString() on obj . Так что вы, вероятно, не найдете ее в исходном коде Scala.