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

时间:2014-10-07 23:26:21

标签: 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 ) )

    }

}

我要做的是打电话给"设置"返回一个对象,允许我将调用链接到" .to",如下所示:

.set( SOMETHING ).to( OTHER )

但我不能说

def foo = object { ... }

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

2 个答案:

答案 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] ) =
    ...
}

请注意,我使用了ReturnTypeOfFromReturnTypeOfSet,因为我不知道您的方法返回了什么。顺便说一句,这是一个坏习惯:公共方法应该总是有一个明确的结果类型。

答案 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

}