Создание классов, которые могут быть созданы с использованием одного или нескольких элементов в качестве аргумента конструктора в Scala - PullRequest
1 голос
/ 01 июня 2010

Я хочу иметь класс, для которого можно создать список, массив, последовательность, набор, стек, очередь и т. Д. На мой взгляд

class A
class B(elems:A*)

должен справиться с такими вещами.

Это мое решение:

class A
class B(elems:Iterable[A]){
    def this(elem:A) = this(Seq(elem))
}

Можете ли вы предложить какие-либо улучшения?

Ответы [ 2 ]

10 голосов
/ 01 июня 2010

Любой Seq или Array может быть передан методу с повторяющимися параметрами, используя надпись : _*:

scala> def m1(strs: String*): Int = { strs.foldLeft(0)(_ + _.length) }
m1: (strs: String*)Int

scala> m1("foo", "bar")
res0: Int = 6

scala> val ss1 = Array("hello", ", ", "world", ".")
ss1: Array[java.lang.String] = Array(hello, , , world, .)

scala> m1(ss1: _*)
res1: Int = 13

scala> val ss2 = List("now", "is", "the", "time")
ss2: List[java.lang.String] = List(now, is, the, time)

scala> m1(ss2: _*)
res2: Int = 12
1 голос
/ 01 июня 2010

Это может быть незначительное улучшение.

class A
class B(elems:Iterable[A]){
    def this(elem:A*) = this(elem.asInstanceOf[Iterable[A]])
}

Это сделает их легальными

val b1 = new B(a1)
val b2 = new B(a2, a3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...