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 类型关键字:如何最好地在多个类中使用它的主要内容,如果未能解决你的问题,请参考以下文章