【问题标题】:Generic sealed trait fromString() method通用密封特征 fromString() 方法
【发布时间】:2020-07-20 16:00:01
【问题描述】:

考虑以下代码:

sealed trait Foo {
  def name: String
}

case object FooA extends Foo {
  override val name: String = "a"
}

case object FooB extends Foo {
  override val name: String = "b"
}

object Foo {
  def fromString(name: String): Foo = {
    name match {
     case FooA.name => FooA
     case FooB.name => FooB  
  }
}

我可以重构 fromString() 方法以避免每个案例对象实例都有一个案例吗?一些更通用的代码能够枚举所有 Foo 实例?

在我的真实版本中,我开始有很多case对象,case bla.name => bla的墙让我很无聊^^

谢谢:)

【问题讨论】:

  • Enumeratum 库可能会为您提供所需的帮助。
  • 你可以看看stackoverflow.com/questions/13671734/… 有类似的问题
  • 是的,在这一点上它实际上几乎是重复的。谢谢,没找到^^'

标签: scala


【解决方案1】:

Beachape 提供了一个开箱即用的枚举库:

将此包含在您的build.sbt

"com.beachape" %% "enumeratum" % "1.5.15"

提供的Enum 类只需要像这样扩展:

import enumeratum._

sealed trait Foo

object Foo extends Enum[Foo] {
  case object FooA extends Foo 
  case object FooB extends Foo 
}

有一个名为withName 的函数可以让您通过其字符串名称获得正确的密封特征:

Foo.withName("FooA")

【讨论】:

    【解决方案2】:

    这样的事情怎么样?

    sealed trait Foo {
      def name: String
    }
    
    object Foo {
      case object FooA extends Foo {
        override val name: String = "a"
      }
    
      case object FooB extends Foo {
        override val name: String = "b"
      }
    
      val values = Seq(FooA, FooB)
    
      def withName(name: String): Option[Foo] = {
        values.find(value => value.name.equals(name))
      }
    }
    

    然后您可以使用withName(String) 方法获取Foo 类型的相应具体对象作为Option

    val testFooAName = "a"
    val testFooA = Foo.withName(testFooAName) // Will yield Some(FooA)
    
    testFooA match {
        case Some(Foo.FooA) => println("Matched Foo.FooA!")
        case Some(Foo.FooB) => println("Matched Foo.FooB!")
    }
    
    val testFooNoneName = "none"
    val testFooNone = Foo.withName(testFooNoneName) // Will yield None
    
    Output:
    Matched Foo.FooA!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2020-03-30
      • 2015-09-17
      • 2015-04-22
      • 2012-11-21
      相关资源
      最近更新 更多