相关疑难解决方法(0)

实现支持方法链的Scala特征的最佳实践

我想创建一个特性,为类添加一些属性,并使链式方法成为可能.在Scala 2.8.1中测试过.

trait SomeProperty {
    var prop : String = "default"
    def setProp(s: String) = {
        prop = s
        this
    }
}
sealed abstract class Value
case class IntegerValue(v: Int) extends Value
case class FloatValue(v: Float) extends Value with SomeProperty {
    def foo() = { println("I'm foo.") }
}
case object UnknownValue extends Value with SomeProperty {
    def bar() = { println("I'm bar.") }
}

scala> val x = UnknownValue
scala> x.setProp("test").bar()
<console>:10: error: value bar is not a member …
Run Code Online (Sandbox Code Playgroud)

scala traits method-chaining

10
推荐指数
1
解决办法
3827
查看次数

Scala DSL:使用无参数方法链接的方法

我正在创建一个小scala DSL并遇到以下问题,我真的没有解决方案.我想要实现的一个小概念示例:

(Compute
 write "hello"
 read 'name
 calc()
 calc()
 write "hello" + 'name
)
Run Code Online (Sandbox Code Playgroud)

定义这个dsl​​的代码大致如下:

Object Compute extends Compute{
  ...
 implicit def str2Message:Message = ...
}
class Compute{
 def write(msg:Message):Compute = ...
 def read(s:Symbol):Compute = ...
 def calc():Compute = { ... }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是:如何在计算后摆脱这些括号?可能吗?如果是这样,怎么样?只是在定义中省略它们并没有帮助,因为编译错误.

dsl scala

6
推荐指数
1
解决办法
1120
查看次数

有没有办法在Scala中提供自定义编译错误消息?

假设我正在构建一个库,并且我想向用户提供某些自定义编译时错误消息.有没有办法在Scala中提供这个,也许使用注释?

annotations scala

3
推荐指数
1
解决办法
616
查看次数

Scala:使用稍后创建的实例初始化字段

假设我有这两个类:

class Person (val name: String, val surname: String)

class Family (val nameFamily: String, val members: Set[Person])
Run Code Online (Sandbox Code Playgroud)

现在在main方法中实例化两个类,如下所示:

val F1 = new Family ("Red", Set(P1, P2))
val P1 = new Person ("John", "Smith")
val P2 = new Person ("Luis", "Smith")
Run Code Online (Sandbox Code Playgroud)

主要方法允许我在实例化之前输入家庭成员.我希望这是我的模特.但如果我在成员之前进入成员,那么当我去写作:

println(F1.members)
Run Code Online (Sandbox Code Playgroud)

我返回一个Set(null).

如果你先写下主要人物,就像这样:

val P1 = new Person ("John", "Smith")
val P2 = new Person ("Luis", "Smith")  
val F1 = new Family ("Red", Set(P1, P2))
Run Code Online (Sandbox Code Playgroud)

我没有问题.

但是我想以任何顺序编写实例,最后运行一个家庭验证.

我可以解决这个问题.我的意思是,我可以使用稍后创建的实例初始化我的字段.

对不起英文翻译不好.

上传#1

我在Scala中实现了一个域,我使用DSL创建了域的实例.我的DSL允许我以混合顺序实例化类.例如,我创建一个Component,然后向该Component添加一些Type.然后我创建我添加到Component的Type.在主要方法中我可以做到.作为主要的最后一个陈述,我把验证.在开始验证时,键入组件没有找到任何内容,因为这些将在以后实例化.这个问题只能在主要用懒惰解决?或者是域级别的解决方案.

scala field initialization

2
推荐指数
1
解决办法
1956
查看次数

如何创建不需要显式构建方法的类型安全构建器?

我使用了轻微滥用构建器模式来制作流畅的命令式执行链.我所追求的是一种使编译错误忘记最后的execute方法的方法.我的目标是如下

WithServiceA {
 doStuff()
} WithServiceB {
  doStuff()
} withClient client
Run Code Online (Sandbox Code Playgroud)

WithServiceA并且WithServiceB都可以返回值,因此如果使用返回值,很明显返回类型是错误的,但如果它们被强制使用,整个对象就会默默地落在地板上.我想确保忘记withClient调用是一个编译错误,无论它在什么上下文中使用.

我希望能够跳过块,如果它们是不需要的并按任意顺序放置,所以我希望替换我之前使用的嵌套内部类模式ala

def onServiceA[A](body: ServiceA => A) = new {   
  def onServiceB[B >: A](body: ServiceB => B) = {b => {
    doStuff()
  }
}
Run Code Online (Sandbox Code Playgroud)

scala builder

1
推荐指数
1
解决办法
203
查看次数