Scala 类型关键字:如何最好地在多个类中使用它

Posted

技术标签:

【中文标题】Scala 类型关键字:如何最好地在多个类中使用它【英文标题】:Scala type keyword: how best to use it across multiple classes 【发布时间】: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._ 【参考方案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

【讨论】:

以上是关于Scala 类型关键字:如何最好地在多个类中使用它的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 具有大量字段的域对象

TypeScript 中是不是有在类中使用的关键字来获取其类型?

如何最好地在 Windows 上实现软件更新? [关闭]

Scala 类型参数不符合类型参数范围

如何在Java类中定义接口属性并如何使用接口的方法

如何在 Scala 中设置多个类型边界?