2015-03-08 4 views
2

У меня есть эта строка кода, где я использую наиболее идиоматических способ я знаю, для уничтожения того объекта возвращается из функции:Scala экстремальное разрушение?

val (a, b) = foo match { case MyObjectType(a, b) => (a, b) } 

объекта прототипа являются:

case class MyObjectType(Type1: SomeType1, Type2: SomeType2) 

Конечно В противном случае я мог бы:

val returnType = foo 
val (a, b) = (returnType.a, returnType.b) 

Но последнее - это совсем другая форма постановки одной и той же проблемы - это действительно не изящно. Мог ли макрос Scala прийти на помощь, чтобы предоставить сжатую идиому? возможно, позволяющий использовать синтаксис:

val (a, b) = foo deconstruct { MyObjectType(a, b) => (a, b) } // merely more shorthand, like scala allows e.g. within a map block 

val (a, b) = tuplize(foo)          // assumes tuplize can iterate the vals of MyObjectType 

tupleResult(a, b) = foo          // radical macro api exploring the limits of macro safety... 

tupledVars(foo)            // macro extreme 

ответ

8

Ответ на вопрос, но это не дает вам кортежа. Вы знаете, что это работает:

val MyObjectType(a,b) = foo

Кроме того, если вы уничтожение того переменной длины T * вы можете сделать такой код следующим образом:

val Array(first, second, _*) = Array(1,2,3,4) 
val Array(fst, snd, _*) = Array(1,2) 

Если вы хотите кортежи непосредственно видеть In Scala, is there an easy way to convert a case class into a tuple?

+0

Спасибо, что это лучше, чем кортеж, я думал о кортеже только потому, что думал, что решение пройдет через один, но это выполнит свою работу! Интересно, как это работает под капотом, хотя ... Ответ на этот ответ был действительно плохим ответом на него BTW. Это решение гораздо более полезно, но я удивляюсь, почему он работает, если вы хотите сделать это. – matanster

0

Вы можете изучить общее программирование с помощью Shapeless

scala> import shapeless._, syntax.std.product._, syntax.std.tuple._ 
import shapeless._ 
import syntax.std.product._ 
import syntax.std.tuple._ 

scala> case class Foo(i: Int, s: String, b: Boolean) 
defined class Foo 

scala> val foo = Foo(1, "foo", true) 
foo: Foo = Foo(1,foo,true) 

Теперь с помощью Generic мы можем преобразовать Foo в HList и обратно

scala> Generic[Foo].to(foo) 
res0: shapeless.::[Int,shapeless.::[String,shapeless.::[Boolean,shapeless.HNil]]] = 1 :: foo :: true :: HNil 

scala> Generic[Foo].from(res0) 
res1: Foo = Foo(1,foo,true) 

Или вы можете использовать хороший синтаксический сахар обеспечивается syntax.std.product

scala> foo.toHList 
res2: this.Repr = 1 :: foo :: true :: HNil 

scala> foo.toTuple 
res3: (Int, String, Boolean) = (1,foo,true) 

feature overview Смотрите и examples для получения дополнительной информации.

+0

Спасибо, но сейчас я держу руку без смешивания в бесформенной, пока не получу лучшее понимание того, что она делает под капотом и, в частности, влияние ее идиомы на производительность – matanster

 Смежные вопросы

  • Нет связанных вопросов^_^