在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的“静态”变量的更甜的语法。