Распаковка типов "кортеж" в Scala

Вы можете создать новый объект, разрушив obj1 и добавив к нему cities.

obj1 = {
  name: 'a',
  age: '23'
};

obj2 = {
  city1: 'x',
  city2: 'y'
};

obj3 = {
  ...obj1,
  cities: Object.entries(obj2)
    .map(([k, v]) => ({[k]: v}))
};

console.log(obj3);

7
задан starblue 23 February 2009 в 07:59
поделиться

3 ответа

Вы не можете распаковать, по сути, но возможно это достигает того, что Вы хотите:

  type First
  type Second
  type Element = (First, Second)
  def get(x: First): Second
3
ответ дан 7 December 2019 в 10:08
поделиться

Я немного опоздал с этим, но как насчет использования сопоставления с образцом? Не имеет правильного возвращаемого типа, и мой синтаксис может быть немного неправильным, но вот:

def get[K](key: K): Iterable[Any] {
  for ((key, x) <- elements) yield x
}
0
ответ дан 7 December 2019 в 10:08
поделиться

Это не распаковывает типы, но ограничивает типы A и B при вызове get.

trait Container {
  type Element
}

trait AssociativeContainer extends Container {
  type Element <: Tuple2[_, _]

  def get[A, B](x: A)(implicit ev: (A, B) =:= Element): B
}

Это выглядит многообещающе, но это обман - это не работает, если Element является абстрактным.

def Unpack[T<:Tuple2[_, _]] = new {
  def apply[A, B](implicit ev: T <:< (A, B)) = new {
    type AA = A
    type BB = B
  }
}

trait AssociativeContainer {
  type Element = (Int, String)
  val unpacked = Unpack[Element].apply
  type A = unpacked.AA
  type B = unpacked.BB

  1: A
  "": B
  def get(x: A): B
}
3
ответ дан 7 December 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: