在Scala中,如何在参数列表中表示事物和事物组的混合?X=(X |原子)*

在Scala中,如何在参数列表中表示事物和事物组的混合?X=(X |原子)*,scala,Scala,我有一个*-参数方法。我希望能够传递原子和基团的混合物 将原子注入该方法。理想情况下,我希望小组也能够举行小组 语法规则是: X = (X | atom)* 组需要排序,但不一定是类列表 其动机是有许多对*-参数方法的调用,并且一些参数组在这些调用中多次出现。我希望能够将这些组存储在VAL中以重新使用它们。为什么不使用类似的东西 trait GroupOrAtom // or any other nicer name! class Atom extends GroupOrAtom class

我有一个
*
-参数方法。我希望能够传递原子和基团的混合物 将原子注入该方法。理想情况下,我希望小组也能够举行小组

语法规则是:

X = (X | atom)*
组需要排序,但不一定是类列表


其动机是有许多对
*
-参数方法的调用,并且一些参数组在这些调用中多次出现。我希望能够将这些组存储在VAL中以重新使用它们。

为什么不使用类似的东西

trait GroupOrAtom // or any other nicer name!
class Atom extends GroupOrAtom
class AtomGroup(val atoms: Seq[Atom]) extends GroupOrAtom

def process(elements: GroupOrAtom*) = ...

如果您正在寻找一种更奇特的方法来使用联合类型,请尝试阅读。不过,这可能不是您的第一选择,因为实现像
GroupOrAtom
这样的共同特征的解决方案更清晰、更容易。

为什么不这样做呢

trait GroupOrAtom // or any other nicer name!
class Atom extends GroupOrAtom
class AtomGroup(val atoms: Seq[Atom]) extends GroupOrAtom

def process(elements: GroupOrAtom*) = ...

如果您正在寻找一种更奇特的方法来使用联合类型,请尝试阅读。不过,这可能不是您的第一选择,因为实现像
GroupOrAtom
这样的通用特性的解决方案更清晰、更简单。

传递元组对您有用吗

def processor(tokens: Any) = // pattern match on tuples

processor('atom)
processor('atom1, 'atom2)
processor('atom1, ('atom2a, 'atom2b))

传递元组对你有用吗

def processor(tokens: Any) = // pattern match on tuples

processor('atom)
processor('atom1, 'atom2)
processor('atom1, ('atom2a, 'atom2b))

您可以对特征进行密封以获得模式匹配的额外检查。您可以对特征进行密封以获得模式匹配的额外检查。