#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
переопределяет JavaObject.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()
onobj
. Так что вы, вероятно, не найдете ее в исходном коде Scala.