10

我想做一些时髦的闭包之类的东西。我想要一个方法来返回一个匿名对象,该对象的胆量引用了该方法的参数。这是我编写的代码,说明了我的意图:

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 ) )

    }

}

我正在尝试做的是调用“set”返回一个对象,该对象允许我将调用“.to”链接在一起,如下所示:

.set( SOMETHING ).to( OTHER )

但我不能说

def foo = object { ... }

Scala有没有办法得到我想要的东西?我必须定义一个类并实例化它吗?

4

2 回答 2

14

您可以简单地返回一个新的匿名对象。您的语法几乎是正确的:只需替换objectnew

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因为我不知道您的方法返回什么。顺便说一句,这是一个坏习惯:公共方法应该始终具有明确的结果类型。

于 2014-10-08T03:18:36.590 回答
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

}
于 2014-10-08T00:33:04.377 回答