【问题标题】:how to use generics in Scala如何在 Scala 中使用泛型
【发布时间】:2015-04-09 07:03:52
【问题描述】:

我已经对这个组件进行了编码,可以在不同的语言之间切换:

import scala.collection.mutable.Map

sealed trait Language
case object English extends Language {
  val messages: Map[String, String] =
    Map("M01" -> "Ready for cooking - press START",
      "M02" -> "Close the door to start cooking")
}
case object French extends Language {
  val messages: Map[String, String] =
    Map("M01" -> "Pret pour la cuisson - presse START",
      "M02" -> "Fermez la porte pour commencer la cuisson")
}

class Lang {

  //The default Language
  private var language: Language = English

  def chosen(lang: Language) = language = lang

  def displayMessage(msg: String) = language match {
    case English => English messages msg
    case French => French messages msg 
  }

}

我关心的是如何使用参数化来构建这样的组件,然后使用为其参数提供的不同语言对其进行配置?

【问题讨论】:

    标签: scala templates generics parameters components


    【解决方案1】:

    我认为在这种情况下你真的不需要泛型。

    另外...你的设计感觉有些不对劲。无论如何...如果您认为您有泛型的用例...您可以这样做。

    改变你的性格

    sealed trait Language {
      val messages: Map[ String, String ]
    }
    

    现在像这样定义你的泛型类,

    class Lang[ A <: Language ]( var language: A = English ) {
    
      def chosen( lang: A ): Unit = {
        language = lang
      }
    
      def displayMessage(msg: String): Unit = {
        language messages msg 
      }
    
    }
    

    【讨论】:

    • “你的设计感觉有点不对劲”——你认为我做了一个糟糕的设计吗?我想知道是不是这样,因为我打算尝试不同的设计方式,而且你知道 Scala 有很多方法可以做某事,而且很难知道哪个是首选!感谢您的解决方案。
    • @Valerin 设计的好坏完全取决于用例。所以...我不知道这对您的用例是坏的还是好的。但对我来说,这看起来有点不寻常。
    • 我们不能调用字段messages,虽然这个引用:language messages msg
    • 哦...是的...那是真的...我认为特征语言具有定义消息...正在编辑答案。
    • 现在应该修复了。
    【解决方案2】:

    您的代码看起来简单而干净,我不确定泛型是否会改进它。

    但是,您可以将 Lang 的实现移到 Language 中。您必须将语言对象作为方法参数传递,也许是隐式传递。参数的类型是 T

    我可能宁愿坚持使用您的简单查找表,但将类 Lang 更改为对象 Language,即 Language 特征的伴随对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多