在编写Haskell的拼写之后回到Scala,我开始使用type关键字使我的类定义更具可读性,例如:
type RestfulParams = Map[String, String]
def canonicalize(params: RestfulParams): String = { ... }
Run Code Online (Sandbox Code Playgroud)
我遇到的麻烦是这些类型定义需要存在于类或对象中 - 它们不像Haskell中的"一等公民".如果我尝试在类或对象之外定义类型,我会得到一个编译器expected class or object definition.
那么我的问题是如何在包中的多个类和对象中使用这些类型?我现在所做的事情看起来很难看:
object RestfulTypes { type RestfulParams = Map[String, String] etc }
Run Code Online (Sandbox Code Playgroud)
然后在另一个类文件中:
import utils.{RestfulTypes => RT}
def get(resource: String, params: RT.RestfulParams): String = { ... }
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点 - 顺便说一句,Scala大师认为类型只能在类/对象中定义是好事还是坏事?
在我每天用Java做的工作中,我使用构建器来进行流畅的接口,例如: new PizzaBuilder(Size.Large).onTopOf(Base.Cheesy).with(Ingredient.Ham).build();
使用快速而肮脏的Java方法,每个方法调用都会改变构建器实例并返回this.不可避免地,它涉及更多的打字,在修改之前首先克隆构建器.构建方法最终会对构建器状态进行繁重的处理.
什么是在Scala中实现相同的好方法?
如果我想确保onTopOf(base:Base)只调用一次,然后只调用with(ingredient:Ingredient)并且build():Pizza可以被称为a-la定向构建器,我将如何进行此操作?
Optionmonad是一种很好的表达方式来处理Scala中的某些东西或者什么都没有.但是如果在"无"发生时需要记录消息呢?根据Scala API文档,
Either类型通常用作scala.Option的替代,其中Left表示失败(按惯例),Right表示类似于Some.
但是,我没有运气找到使用Either的最佳实践或涉及处理失败的Either的良好实际示例.最后,我为自己的项目提出了以下代码:
def logs: Array[String] = {
def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
val config = ca.getConfiguration(PID, null)
config.properties getOrElse immutable.Map.empty
}
def checkType(any: Any): Option[Array[String]] = any match {
case a: Array[String] => Some(a)
case _ => None
}
def lookup: Either[(Symbol, String), Array[String]] =
for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
val array <- checkType(logsParam).toRight('warning -> "unknown type of …Run Code Online (Sandbox Code Playgroud)