gpt4 book ai didi

返回匿名对象的 Scala 函数?

转载 作者:行者123 更新时间:2023-12-01 18:34:14 26 4
gpt4 key购买 nike

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

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 有没有办法得到我想要的东西?我必须定义一个类并实例化它吗?

最佳答案

您可以简单地返回一个新的匿名对象。您的语法几乎是正确的:只需将 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 因为我不知道您的方法返回什么。顺便说一句,这是一个坏习惯:公共(public)方法应该始终具有显式结果类型。

关于返回匿名对象的 Scala 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26246879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com