我想做一些时髦的闭包式的东西。我想要一个方法来返回一个匿名对象,该对象的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 ) )
}
}
我要做的是打电话给"设置"返回一个对象,允许我将调用链接到" .to",如下所示:
.set( SOMETHING ).to( OTHER )
但我不能说
def foo = object { ... }
Scala有没有办法让我得到的东西?我是否必须定义一个类并实例化它?
答案 0 :(得分:12)
您只需返回一个新的匿名对象即可。您的语法几乎正确:只需将object
替换为new
:
def set( dest: String ) = new {
def from( src: String ) =
...
def to[T]( v: Expression[T] ) =
...
}
但是,这将在调用站点提供结构类型,必须使用反射来使用这些方法。要防止这种情况,请使用对象的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] ) =
...
}
请注意,我使用了ReturnTypeOfFrom
和ReturnTypeOfSet
,因为我不知道您的方法返回了什么。顺便说一句,这是一个坏习惯:公共方法应该总是有一个明确的结果类型。
答案 1 :(得分:0)
我不确定你想做什么,所以希望这会给你起点 你不能拥有匿名对象,但你可以有内部对象,所以你可以这样做:
implicit class SessionManagementExtensions(val c: ChainBuilder) {
object MyInnerObject {
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))
}
def set(dest: String) = MyInnerObject
}