【问题标题】:Scala type keyword: how best to use it across multiple classesScala 类型关键字:如何最好地在多个类中使用它
【发布时间】:2011-11-18 11:15:21
【问题描述】:

在写完 Haskell 之后回到 Scala,我开始使用 type 关键字来使我的类定义更具可读性,例如:

type RestfulParams = Map[String, String]
def canonicalize(params: RestfulParams): String = { ... }

我遇到的问题是这些类型定义需要存在于类或对象中——它们不像在 Haskell 中那样是“一等公民”。如果我尝试在类或对象之外定义类型,我会得到一个编译器 expected class or object definition

然后我的问题是如何在包中的多个类和对象中使用这些类型?我现在所做的似乎很丑陋:

object RestfulTypes { type RestfulParams = Map[String, String] etc }

然后在另一个类文件中:

import utils.{RestfulTypes => RT}
def get(resource: String, params: RT.RestfulParams): String = { ... }

有没有更好的方法来做到这一点 - 顺便提一下,Scala 大师是否认为类型只能在类/对象中定义是好事还是坏事?

【问题讨论】:

  • 为什么不import utils.RestfulTypes._

标签: scala types


【解决方案1】:

package objects 会为你工作吗?

来自文章:

在 2.8 之前,您可以放入包中的唯一内容是类、特征和独立对象。到目前为止,这些是位于包顶层的最常见定义,但 Scala 2.8 并不仅限于这些定义。任何可以放在类中的定义,也可以放在包的顶层。如果你有一些帮助方法,你想在整个包的范围内,继续把它放在包的顶层。为此,您将定义放在一个包对象中。每个包允许有一个包对象。放置在包对象中的任何定义都被视为包本身的成员。

package object scala 已经有许多类型和值,所以我认为您可以对自己的类型使用相同的技术。

【讨论】:

    【解决方案2】:

    我不确定在这种情况下什么是好的,但这里有两个选项:

    使用特征:(Scala's Selfless Trait Pattern)

    trait RestfulTypes {
      type Params = Map[String,String]
      //...
    }
    
    object MyRestService extends RestService with RestfulTypes { /* ... */ }
    

    或者只是导入对象的成员,像包一样有效地使用它:

    import util.RestfulTypes._
    

    【讨论】:

    • @agilesteel:链接不应该是第一个,因为它只属于第一个选项,编辑时请不要改变我的答案的意思。
    • 谢谢,无私的特质模式很酷。我意识到我已经看到各种使用它的 Scala 框架和工具,只是没有意识到它是什么。再次感谢您的回答。
    • @Kim:对不起,不会再发生了。
    【解决方案3】:

    您可以使用包对象并将类型声明放入其中。当您导入该包时,类型定义将可用。

    一个例子:

    //package myType
    package object myType {type mine = List[String]}
    

    请注意,包对象与包具有相同的名称,以便在没有对象前缀的情况下使用,即 myType.mine 如果你用不同的名字命名它,例如:

    //package myType
    package object mainType {type mine = List[String]}
    

    导入“package”时可以通过mainType.mine访问

    更多信息: http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多