在Scala中,如何声明函数中的静态数据?
在许多情况下,我发现我需要在函数的作用域中创建长期存在的值,而不需要将这些数据放在类/对象作用域中 比如说,在Scala中,如何声明函数中的静态数据?,scala,Scala,在许多情况下,我发现我需要在函数的作用域中创建长期存在的值,而不需要将这些数据放在类/对象作用域中 比如说, object Example { def activeUsers = { val users = getUsersFromDB // Connects to the database and runs a query. users.filter(_.active) } } 上面,变量users在正确的范围内,但每次调用函数activeUser
object Example {
def activeUsers = {
val users = getUsersFromDB // Connects to the database and runs a query.
users.filter(_.active)
}
}
上面,变量users
在正确的范围内,但每次调用函数activeUsers
时,它都会执行数据库查询
为了避免这种情况,我可以将变量users
移到函数范围之外:
object Example {
val users = getUsersFromDB // Connects to the database and runs a query
def activeUsers = {
users.filter(_.active)
}
}
但这也使得它可以用于其他功能
否则,我可以创建一个单独的对象来封装函数:
object Example {
object activeUsers {
val users = getUsersFromDB // Connects to the database and runs a query.
def apply() = {
users.filter(_.active)
}
}
}
但这涉及到更多的样板代码、使用另一个对象以及与apply
相关的轻微语法异常
- 在语言层面上有这样的支持吗
- 如果没有,您在这种情况下是否使用了任何标准技术
object Example {
val activeUsers = {
val users = getUsersFromDB
() => users.filter(_.active)
}
}
解释
activeUsers
是一个类型为Function1[Unit,…您的筛选结果类型…]
的变量(或者我们可以将此类型写为(Unit=>…您的筛选结果类型…
,这是相同的),即此变量存储函数。因此,您以后可能会以与函数无法区分的方式使用它,例如activeUsers()
我们用一个代码块初始化这个变量,在这里我们声明变量users
,并在匿名函数()=>users.filter(u.active)
中使用它,因此它是一个闭包(因为它有一个绑定变量users
)
因此,我们实现了您的目标:(1)
activeUsers
看起来像一种方法;(2) 用户
计算一次;(3)filter
对每个调用都有效。扩展FunctionXX是实现该目标的另一种方式;它可能具有提供更好文档的优势。参数类型和返回值类型在声明的第一行都可见:
val activeUser = new Function0[List[String]] {
val users = getUsersFromDB
def apply = users filter (_.active)
}
完全正确你可能想解释一下那里发生了什么,以及它为什么起作用。谢谢你的解释。我仍然希望能找到一种类似于C的“静态”变量的更甜的语法。