首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala类型关键字:如何最好地跨多个类使用它

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

Stack Overflow用户
提问于 2011-09-16 15:09:07
回答 2查看 27.4K关注 0票数 71

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

代码语言:javascript
复制
type RestfulParams = Map[String, String]
def canonicalize(params: RestfulParams): String = { ... }

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

我的问题是如何在包中的多个类和对象中使用这些类型?我现在做的事情看起来很丑陋:

代码语言:javascript
复制
object RestfulTypes { type RestfulParams = Map[String, String] etc }

然后在另一个类文件中:

代码语言:javascript
复制
import utils.{RestfulTypes => RT}
def get(resource: String, params: RT.RestfulParams): String = { ... }

有没有更好的方式来做这件事-顺便说一句,Scala专家认为类型只能在类/对象中定义是一件好事还是坏事?

EN

回答 2

Stack Overflow用户

发布于 2011-09-16 16:35:14

我不确定在这种情况下是什么构成了美好,但这里有两个选择:

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

代码语言:javascript
复制
trait RestfulTypes {
  type Params = Map[String,String]
  //...
}

object MyRestService extends RestService with RestfulTypes { /* ... */ }

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

代码语言:javascript
复制
import util.RestfulTypes._
票数 11
EN

Stack Overflow用户

发布于 2013-05-02 16:37:53

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

举个例子:

代码语言:javascript
复制
//package myType
package object myType {type mine = List[String]}

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

代码语言:javascript
复制
//package myType
package object mainType {type mine = List[String]}

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

有关更多信息,请访问:http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7441277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档