В JavaScript, мы можем сделать:Как создать гетерогенный массив в Scala?
["a string", 10, {x : 1}, function() {}].push("another value");
Что является эквивалентом Scala?
В JavaScript, мы можем сделать:Как создать гетерогенный массив в Scala?
["a string", 10, {x : 1}, function() {}].push("another value");
Что является эквивалентом Scala?
Массивы в Скале очень однородны. Это связано с тем, что Scala является статически типизированным языком. Если вам действительно нужны псевдогетерогенные функции, вам нужно использовать неизменяемую структуру данных, которая ковариационно параметризована (наиболее непреложные структуры данных). List
- это канонический пример, но Vector
также является опцией. Затем вы можете сделать что-то вроде этого:
Vector("a string", 10, Map("x" -> 1),()=>()) + "another value"
Результат будет типа Vector[Any]
. Не очень полезно с точки зрения статической типизации, но все будет там, как и было обещано.
Кстати, "буквальный синтаксис" для массивов в Scala выглядит следующим образом:
Array(1, 2, 3, 4) // => Array[Int] containing [1, 2, 3, 4]
Смотрите также: More info on persistent vectors
Scala может получить способность к "гетерогенный" список в ближайшее время : HList in Scala
Scala выберет наиболее подходящий тип элемента Array, который может содержать все значения, в этом случае необходим самый общий тип Any
который является супертипом любого другого типа:
Array("a string", 10, new { val x = 1 },() =>()) :+ "another value"
Полученный массив будет иметь тип Array[Any]
.
Лично я, вероятно, использовал бы кортежи, как упоминает хром в комментарии.
scala> ("a string", 10, (1),() => {})
res1: (java.lang.String, Int, Int,() => Unit) = (a string,10,1,<function0>)
Но вы не можете легко добавлять такие конструкции.
HList, упомянутый ePharaoh, «сделан для этого», но я, вероятно, остался бы в стороне от него сам. Это тяжелое программирование по типу и, следовательно, может нести с собой удивительные нагрузки (т. Е. Создавать множество классов при компиляции). Просто будь осторожен. HList вышеперечисленное (требуется библиотека MetaScala) будет (не доказано, так как я не использую MetaScala):
scala> "a string" :: 10 :: (1) ::() => {} :: HNil
Вы можете добавить и т.д. (ну, по крайней мере, перед именем) в такой список, и будут знать типы. Prepending создает новый тип, который имеет старый тип как хвост.
Тогда есть еще один подход, который не упоминается. Классы (особенно тематические классы) очень легкие на Scala, и вы можете сделать их как остроты:
scala> case class MyThing(str: String, int: Int, x: Int, f:() => Unit)
defined class MyThing
scala> MyThing("a string", 10, 1,()=>{})
res2: MyThing = MyThing(a string,10,1,<function0>)
Конечно, это не будет обрабатывать добавление либо.
Этот ответ ужасно запутанный - факт в том, что пример OP отлично работает с Scala `Array`, как показывает ответ @ soc. Существуют и другие варианты, такие как «Список» и «Вектор», но причины их использования или их использования не имеют никакого отношения к тому, является ли случай использования однородным или «псевдогетерогенный». – 2011-08-31 05:37:20
Ответ пронизан жаргоном, который может сбить с толку. Это также объясняет многое, если вы получаете то, что он говорит. Я подозреваю, что эта фразировка была сделана специально, поскольку OP исходит из javascript. – providence 2011-10-01 03:56:18