Scala 极端解构?

标签 scala macros destructuring

我有这行代码,我使用我所知道的最惯用的方式来解构从函数返回的对象:

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

对象的原型(prototype)是:

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

最佳答案

有点像答案,但不会给您一个元组。你知道这行得通吗:

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?

关于Scala 极端解构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927352/

相关文章:

javascript - JS 代理和解构赋值

Javascript (ES6),基于变量的解构

json - 如何使用嵌套 case 类并喷射 json 隐式

Scala 列出了 "var"的用法

scala - 返回Future.failed(Exception)与引发异常之间的区别

scala - 如何创建一个对数组和选项通用的函数

macros - 如何在 Rust 中编写宏来匹配集合中的任何元素?

lambda - 创建一个 Lisp 宏,可以将 lambda 应用于上下文中的列表

c++ - `#input`类型的宏字符串在C++中是如何分配的?

javascript - ES6 数组解构并分配给没有函数的对象