在写完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专家认为类型只能在类/对象中定义是一件好事还是坏事?
发布于 2011-09-16 16:35:14
我不确定在这种情况下是什么构成了美好,但这里有两个选择:
使用特征:(Scala's Selfless Trait Pattern)
trait RestfulTypes {
type Params = Map[String,String]
//...
}
object MyRestService extends RestService with RestfulTypes { /* ... */ }
或者只是导入对象的成员,像包一样有效地使用它:
import util.RestfulTypes._
发布于 2013-05-02 16:37:53
您可以使用package对象并将类型声明放在其中。当您导入该包时,类型定义将可用。
举个例子:
//package myType
package object myType {type mine = List[String]}
请注意,package对象与package具有相同的名称,以便可以在没有对象前缀的情况下使用,例如,如果您使用不同的名称命名它,则可以使用myType.mine:
//package myType
package object mainType {type mine = List[String]}
导入package时可通过mainType.mine访问
有关更多信息,请访问:http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html
https://stackoverflow.com/questions/7441277
复制相似问题