Ответ 1
действительно самый сжатый способ написать одноточечный литерал в Scala?
Да.
И работает ли Unit как пустой кортеж?
Нет, поскольку он не реализует Product
.
Неужели эта несогласованность беспокоит кого-то еще?
Не я.
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
как пустой кортеж?
Неужели эта несогласованность беспокоит кого-то еще?
действительно самый сжатый способ написать одноточечный литерал в Scala?
Да.
И работает ли Unit как пустой кортеж?
Нет, поскольку он не реализует Product
.
Неужели эта несогласованность беспокоит кого-то еще?
Не я.
На самом деле это самый сжатый способ написать кортеж с арностью 1.
В комментариях выше я вижу много ссылок на "почему Tuple1 полезен".
Кортежи в Scala расширяют черту Product
, которая позволяет вам перебирать элементы набора.
Можно реализовать метод с параметром типа Product
, и в этом случае Tuple1
является единственным универсальным способом перебора коллекций фиксированного размера с несколькими типами без потери информации о типе.
Существуют и другие причины использования Tuple1
, но это самый распространенный случай использования, который у меня был.
Я никогда не видел ни одного использования Tuple1
. Я тоже не могу себе представить.
В Python, где люди его используют, кортежи представляют собой коллекции фиксированного размера. Кортежи в Scala не являются коллекциями, они являются декартовыми произведениями типов. Итак, Int x Int
- это Tuple2[Int, Int]
, или (Int, Int)
для краткости. Естественно, Int
является Int
, и никакой тип не имеет смысла.
Предыдущие ответы дали действительный набор из 1 элемента. Для одного из нулевых элементов этот код может работать:
object tuple0 extends AnyRef with Product {
def productArity = 0
def productElement(n: Int) = throw new IllegalStateException("No element")
def canEqual(that: Any) = false
}