Scalatypes关键字:如何在多个类中使用它
在编写Haskell之后回到Scala,我已经开始使用type关键字来使我的类定义更具可读性,例如:
type RestfulParams = Map[String, String] def canonicalize(params: RestfulParams): String = { ... }
我遇到的麻烦是这些types定义需要在类或对象内部生存 – 它们不像“Haskell”中的“头等公民”。 如果我尝试在一个类或对象之外定义一个types,我得到一个编译器expected class or object definition
。
我的问题是如何跨包中的多个类和对象使用这些types? 我现在所做的事似乎很难看:
object RestfulTypes { type RestfulParams = Map[String, String] etc }
然后在另一个类文件中:
import utils.{RestfulTypes => RT} def get(resource: String, params: RT.RestfulParams): String = { ... }
有没有更好的方式做到这一点 – 顺便说一句,斯卡拉大师认为只能在类/对象中定义types是好事还是坏事?
包对象是否适合你?
从文章:
直到2.8之前,唯一可以放在软件包中的东西就是类,特性和独立对象。 这是迄今为止最常见的定义,放在一个包的顶层,但Scala 2.8并不仅限于这些。 你可以把任何types的定义放在一个类中,也可以放在一个包的顶层。 如果你有一些帮助方法,你希望在整个包的范围内,那就把它放在包的顶层。 为此,请将定义放入包对象中。 每个包允许有一个包对象。 放置在包对象中的任何定义都被认为是包本身的成员。
包对象scala已经有很多types和值,所以我认为你可以使用相同的技术为你自己的types。
我不确定在这种情况下什么是好的,但有两种select:
使用一个特质:( 斯卡拉的无私特质模式 )
trait RestfulTypes { type Params = Map[String,String] //... } object MyRestService extends RestService with RestfulTypes { /* ... */ }
或者只是导入对象的成员,有效地使用它像一个包:
import util.RestfulTypes._
你可以使用一个包对象,并把types声明在那里。 当您导入该包时,types定义将可用。
一个例子 :
//package myType package object myType {type mine = List[String]}
请注意,包对象与包的名称相同,以便可以在没有对象前缀的情况下使用,例如myType.mine如果用不同的名称命名它,例如:
//package myType package object mainType {type mine = List[String]}
它可以通过mainType.mine访问,当你导入“包”
欲了解更多信息: http : //www.scala-lang.org/docu/files/packageobjects/packageobjects.html