Подтвердить что ты не робот

Имеет ли Scala синтаксис для 0- и 1-кортежей?

scala> val two = (1,2)
two: (Int, Int) = (1,2)

scala> val one = (1,)
<console>:1: error: illegal start of simple expression
       val one = (1,)
                    ^

scala> val zero = ()
zero: Unit = ()

Это:

val one = Tuple1(5)

действительно самый сжатый способ написать однострочный литерал в Scala? И работает ли Unit как пустой кортеж?

Неужели эта несогласованность беспокоит кого-то еще?

4b9b3361

Ответ 1

действительно самый сжатый способ написать одноточечный литерал в Scala?

Да.

И работает ли Unit как пустой кортеж?

Нет, поскольку он не реализует Product.

Неужели эта несогласованность беспокоит кого-то еще?

Не я.

Ответ 2

На самом деле это самый сжатый способ написать кортеж с арностью 1.

В комментариях выше я вижу много ссылок на "почему Tuple1 полезен". Кортежи в Scala расширяют черту Product, которая позволяет вам перебирать элементы набора.

Можно реализовать метод с параметром типа Product, и в этом случае Tuple1 является единственным универсальным способом перебора коллекций фиксированного размера с несколькими типами без потери информации о типе.

Существуют и другие причины использования Tuple1, но это самый распространенный случай использования, который у меня был.

Ответ 3

Я никогда не видел ни одного использования Tuple1. Я тоже не могу себе представить.

В Python, где люди его используют, кортежи представляют собой коллекции фиксированного размера. Кортежи в Scala не являются коллекциями, они являются декартовыми произведениями типов. Итак, Int x Int - это Tuple2[Int, Int], или (Int, Int) для краткости. Естественно, Int является Int, и никакой тип не имеет смысла.

Ответ 4

Предыдущие ответы дали действительный набор из 1 элемента. Для одного из нулевых элементов этот код может работать:

object tuple0 extends AnyRef with Product {
     def productArity = 0
     def productElement(n: Int) = throw new IllegalStateException("No element")
     def canEqual(that: Any) = false
}