Тип пользовательских объектов в Scala - PullRequest
2 голосов
/ 26 апреля 2020

В Scala, Nil на самом деле является объектом, который возвращает пустой список. Когда я набираю Nil, он печатает следующее:

res24: scala.collection.immutable.Nil.type = List() 

res24 - это переменная, тип которой scala.collection.immutable.Nil.type. Я не совсем понимаю последний кусок "тип". Где это находится?

Другой вопрос: Nil возвращает пустой список. Как мы можем написать объект, который возвращает что-то? Я попробовал ниже; он не возвращает целочисленное значение, которое я ожидал.

object Sample { 123 }
val x = Sample
x: Sample.type = Sample$@36fe7b03

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 26 апреля 2020

Я не совсем понимаю последний кусок 'type'. Где это находится?

Это то, что Scala обозначает "Singleton Type" . Nil и Sample имеют общее свойство быть объектами в Scala, что означает, что они являются классами с одним экземпляром (учитывая, что это объявление верхнего уровня, а не вложенное в class внутри данного пакета объем). Это часть определения типа, но она не видна на сайте декларации. Подробнее об использовании синглтон-типа см. Что такое синглтон-тип точно?

Как мы можем написать объект, который возвращает что-то?

Написание object, возвращающего что-то, похоже на вопрос «Могу ли я создать класс, который возвращает значение при создании экземпляра?» . object являются синглетонами и могут иметь методы, которые возвращают значения:

object Bar {
  def x(): Int = 42
}

def main(args: Array[String]): Unit = print(Bar.x())

Что дает 42.

Редактировать

Тем не менее я не Очистим одноэлементный объект Nil, возвращая пустой список

Если мы сможем упростить и подражать c определению List[A], мы увидим, что:

sealed trait List[+A]
case class ::(head: A, tail: List[A]) extends List[A]
case object Nil extends List[Nothing]

Здесь мы имеем Algebrai c Тип данных (ADT), точнее, Sum Type, который представляет собой тип, состоящий из нескольких возможных значений. Здесь List[A] может быть или a ::, или Nil, и в нашем случае это представляет случай пустого списка.

1 голос
/ 26 апреля 2020

В Scala Nil на самом деле является объектом, который возвращает пустой список.

Нет, Nil - это объект, представляющий пустой список (путем расширения из List [Nothing]). См https://alvinalexander.com/scala/what-is-difference-between-nil-empty-list-in-scala/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...