我想做一些时髦的闭包式的东西.我想要一个方法来返回一个匿名对象,该对象的guts引用了该方法的参数.这是我写的代码,说明了我的意图:
object SessionManagement {
implicit class SessionManagementExtensions( val c : ChainBuilder ) {
def set( dest: String ) = object {
def from( src: String ) =
c.exec( session => {
val list = session( src ).as[Vector[String]]
val i = if ( list.size == 0 ) -1 else Random.nextInt( list.size )
val value = if ( i > 0 ) list(i) else "INVALID_" + dest
session.set( dest, value )
})
def to[T]( v: Expression[T] ) =
c.exec( session => session.set( dest, v ) )
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是调用"set"返回一个对象,然后允许我将一个调用链接到".to",如下所示:
.set( SOMETHING ).to( OTHER )
Run Code Online (Sandbox Code Playgroud)
但我不能说
def foo = object { ... }
Run Code Online (Sandbox Code Playgroud)
Scala有没有办法让我得到的东西?我是否必须定义一个类并实例化它?
sjr*_*jrd 13
您只需返回一个新的匿名对象即可.你的语法几乎是正确的:只需替换object为new:
def set( dest: String ) = new {
def from( src: String ) =
...
def to[T]( v: Expression[T] ) =
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这将在调用站点提供结构类型,必须使用反射来使用这些方法.要防止这种情况,请使用对象的API定义特征:
trait SetResult {
def from(src: String): ReturnTypeOfFrom
def to[T](v: Expression[T]): ReturnTypeOfTo
}
def set( dest: String ): SetResult = new SetResult {
def from( src: String ) =
...
def to[T]( v: Expression[T] ) =
...
}
Run Code Online (Sandbox Code Playgroud)
请注意我使用过ReturnTypeOfFrom,ReturnTypeOfSet因为我不知道你的方法返回了什么.顺便说一下,这是一个坏习惯:公共方法应该始终具有明确的结果类型.
| 归档时间: |
|
| 查看次数: |
3823 次 |
| 最近记录: |