在Scala中,如何在函数中声明静态数据?
在许多情况下,我发现我需要在函数范围内创建长寿命值,并且不需要这个数据在类/对象范围内。
例如, object Example { def activeUsers = { val users = getUsersFromDB // Connects to the database and runs a query. users.filter(_.active) } } 以上,变量用户在正确的范围内,但每次调用函数activeUsers时都会执行数据库查询。 为了避免这种情况,我可以将变量用户移到功能范围之外: 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) } } } 但是这涉及更多的样板代码,使用另一个对象和与应用相关的轻微语法怪异。 >在语言层面是否支持这样的东西? 解决方法
另一个选择是使用闭包:
object Example { val activeUsers = { val users = getUsersFromDB () => users.filter(_.active) } } 说明 activeUsers是Function1类型的变量[Unit,…您的过滤器结果类型…](或者我们可以将此类型写为(Unit => …您的过滤器结果类型…),这是相同的),那就是这个变量存储一个函数。因此,您可以稍后以不同于功能的方式使用它,如activeUsers() 我们用一个代码块初始化这个变量,在这个代码块中我们声明了可变的用户,并在匿名函数()=> users.filter(_。active),因此它是一个闭包(因为它有一个绑定变量用户)。 因此,我们实现您的目标:(1)activeUsers看起来像一个方法; (2)用户计算一次;和(3)每次呼叫过滤作品。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |