【问题标题】:Scala variable with multiple types具有多种类型的 Scala 变量
【发布时间】:2017-09-15 15:25:48
【问题描述】:

scala 中有Either,它允许一个变量有两种类型的值。

val x: Either[String, Int] = Left("apple")

但是,我希望变量 x 有 2 种以上的类型,例如{String, Int, Double, List[String] }

e.g. val x:[type can be either String, Int, Double or List[String]]
//So that I can store either String, Int, Double, List[String] value in x.

有什么办法可以做到吗?

【问题讨论】:

  • 我希望有两种以上的变量类型。您能否详细说明这实际上意味着什么,或许可以举个例子?
  • Either[Either[Either[String, Int], Double], List[String]]
  • @YuvalItzchakov 我已经更新了答案。
  • @JörgWMittag,有没有更简单的方法,因为我意识到,我还必须以嵌套方式提供左/右。例如对于 Int - 左(左(右(12)))。有没有办法让我可以像 x = 12 一样做?

标签: scala


【解决方案1】:

IMO 最自然的表达方式是创建 ADT(代数数据类型):

sealed trait Foo
final case class Bar(s: String) extends Foo
final case class Baz(i: Int) extends Foo
final case class Fizz(d: Double) extends Foo
final case class Buzz(l: List[String]) extends Foo

现在您可以在Foo 上进行模式匹配:

val f: Foo = ???
f match {
  case Bar(s) => // String
  case Baz(i) => // Int
  case Fizz(d) => // Double
  case Buzz(l) => // List[String]
}

【讨论】:

    【解决方案2】:

    看无形coproducts

    "shapeless 有一个 Coproduct 类型,是 Scala 的 Either 到 任意数量的选择”

    【讨论】:

    • 这似乎正是我想要的,但是,我现在不能使用任何外部库,但稍后会考虑。顺便说一句,了解它非常有帮助。谢谢。
    【解决方案3】:

    不确定您的确切用例是什么,但请查看:scala type alias - how to have a type that represent multiple data types

    基本上,您创建的特征代表一个伞形/父类。然后,您定义多个扩展父 trait 的类,并将父 trait 作为函数中的预期参数类型。然后,您可以传递任何扩展该父特征的类型。

    您必须包装子类型,但这允许您拥有一个代表多种类型的类型。

    另一种方法是使用泛型类型和类型边界。这些文章讨论了这两个主题:

    我仍在学习 Scala,但希望这会有所帮助! :)

    【讨论】:

    • 您的回答包含很多信息,非常有帮助。谢谢你。 :)
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多