Scala函数返回一个匿名对象?

Joh*_*ood 10 scala gatling

我想做一些时髦的闭包式的东西.我想要一个方法来返回一个匿名对象,该对象的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

您只需返回一个新的匿名对象即可.你的语法几乎是正确的:只需替换objectnew:

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