加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中,如何在函数中声明静态数据?

发布时间:2020-12-16 09:45:52 所属栏目:安全 来源:网络整理
导读:在许多情况下,我发现我需要在函数范围内创建长寿命值,并且不需要这个数据在类/对象范围内。 例如, object Example { def activeUsers = { val users = getUsersFromDB // Connects to the database and runs a query. users.filter(_.active) }} 以上,变
在许多情况下,我发现我需要在函数范围内创建长寿命值,并且不需要这个数据在类/对象范围内。

例如,

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)每次呼叫过滤作品。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读