scala 中的惰性函数定义

2024-02-12

我一直在学习 Scala,我不得不说这是一门非常酷的语言。我特别喜欢它的模式匹配功能和函数文字,但我有 javascript、ruby 背景,这些语言中我最喜欢的模式之一是惰性函数和方法定义模式。 JavaScript 中的一个例子是

var foo = function() {
  var t = new Date();
  foo = function() {
    return t;
  };
  return foo();
};

经过细微调整的相同代码可以在 ruby​​ 中使用,您只需在执行计算后使用单例对象重新定义方法。当涉及昂贵的计算并且您不提前知道是否需要结果时,这种事情非常方便。我知道在 scala 中我可以使用缓存来模拟相同类型的结果,但我试图避免条件检查,到目前为止我的实验返回了负面结果。有谁知道scala中是否有惰性函数或方法定义模式?

注意:javascript代码来自Peter Michaux的site http://peter.michaux.ca/articles/lazy-function-definition-pattern.


JavaScript 中所有复杂的代码似乎只是试图缓存日期的值。在 Scala 中,你可以轻松实现同样的事情:

lazy val foo = new Date

而且,如果甚至不想创建 val,但想调用一个仅在需要时执行昂贵代码的函数,您可以

def maybeExpensive(doIt: Boolean, expensive: => String) {
  if (doIt) println(expensive)
}
maybeExpensive(false, (0 to 1000000).toString)  // (0 to 1000000).toString is never called!
maybeExpensive(true, (0 to 10).toString)        // It is called and used this time

模式在哪里expensive: => String称为按名称参数,您可以将其视为“给我一些可以根据请求生成字符串的东西”。请注意,如果您使用它两次,它每次都会重新生成它,这就是 Randall Schultz 的便捷模式的用武之地:

def maybeExpensiveTwice(doIt: Boolean, expensive: => String) {
  lazy val e = expensive
  if (doIt) {
    println(e)
    println("Wow, that was " + e.length + " characters long!")
  }
}

现在,仅在需要时才生成(通过 by-name 参数)and存储它并在您再次需要时重新使用它(通过惰性 val)。

所以用这种方式,而不是 JavaScript 方式,即使你could让 Scala 看起来很像 JavaScript。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala 中的惰性函数定义 的相关文章

  • Access / Word 2010 VBA 邮件合并尝试打开 [文件夹名称].mdb 而不是 ACCDB 源

    我们正在尝试从 Access 中自动执行邮件合并过程 单击按钮后 VBA 将运行指定当前数据库 accdb 作为数据源并运行 SQL 具体代码如下 Set up Word Dim objWord As Object Set objWord
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse
  • 没有 OAuth 的 Spring Security JWT

    最近我开始学习如何使用oauth 2 0 jwt配置spring boot 我有一个问题 是否可以使用spring boot security jwt避免oauth 2 0 是的 可以使用JWT无需使用标准化的功能OAuth 2 0 flo
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • ngmodel与Angular2中复选框的动态数组绑定

    我有一个 Angular 2 组件 其中我从数组生成复选框列表 现在我需要根据选中的复选框填充不同的数组 这应该是双向绑定 这意味着如果复选框的值已在数组中 则必须已经检查了复选框 我在 Angular 1 中使用了一个名为 checkli
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • NGinx $proxy_add_x_forwarded_for 和 real_ip_header

    我在 NGinx 下有一个 web 应用程序和另一个前端负载均衡器 如下所示 x x x x IP 地址 客户端 a a a a gt LB b b b b gt NGX c c c c gt WEBAPP d d d d 这是我的 NGi
  • Typescript 函数接口重载

    我有以下代码 interface MySecondInterface a type A interface MyInterface val1 string val2 string MySecondInterface a
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 从 Azure 应用服务连接到 MongoDB Atlas 集群

    我在 Azure 上有一个 Web 应用程序 它连接到 Atlas cloud mongodb com 上托管的 MongoDB 集群 我想使用 Atlas 这样我就不必关心 MongoDb 配置 问题是我的集群连接超时 我必须在我的 mo
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 没有 HTML 转义的 Django 表单值

    我需要设置 Django forms ChoiceField 来显示货币符号 由于 django 表单转义了所有 HTML ASCII 字符 我无法得到 或英镑 显示货币符号
  • python中的3D图像旋转

    我有以下图像 I1 我没有捕捉到它 我从谷歌下载的 我将已知的单应性 h 应用到 I1 以获得以下图像 I2 我想假设相机拍摄了上面这张 I2 的照片 我找到了这个 相机 的相机矩阵 令这个相机矩阵为k 现在 我想围绕相机轴旋转该图像 I2
  • 以编程方式拦截我的应用程序中包含的 Android 3rd 方库发起的流量

    我正在尝试编写一些代码来拦截来自 到我的 Android 应用程序的任何网络流量 包括来自非 root 设备上的第 3 方库的流量 有办法做到吗 None
  • 淡出任何接近 UIScollView 边缘的内容

    正如标题所示 当一些 UIImageView 越来越接近 UIScrollView 的四个边缘中的任何一个时 我试图为它们提供淡出效果 由于用户可以拖动 UIImages 如果他将它们拖向边缘 它们就会开始淡出 而不是像 UIScrollV
  • Git 分支未显示所有分支

    我是 Git 的新手 我从 GitHub 克隆了一个分支 当我输入时会显示所有分支git branch 完成工作后 我成功地将其推送到新分支 之后 我将该文件夹复制到另一个目录 因为我想要备份以避免冲突 进入它 然后输入git branch
  • 如何有条件地从两个表之一中选择字段?

    我有两个表发票和待付款 它们都有以下共同行 发票 ID 和余额 我想在 MySQL 中进行选择 这样可以工作 伪代码 if invoice id exists in pending payments table select balance
  • 将扫描的 PDF 转换为可搜索的 PDF(在 R 中)

    我正在尝试使用以下命令将一系列扫描的 PDF 转换为可搜索的 PDFtesseract and pdftools包 我已经完成了两个步骤 现在我需要写回一个可搜索的pdf 阅读扫描版 PDF Run OCR 写回可搜索的 PDF eg lt
  • 如何在纯 Javascript 中的单选按钮上使用 addEventListener?

    如何在 html 中的单选按钮上附加事件侦听器 考虑这种形式
  • 如何使用 NDK 编译适用于 Android 的现有 C 程序?

    我正在编写一个 Android 应用程序来测试网络性能 并且我想在该应用程序中使用 iPerf 我可以找到已经为 Android 编译的二进制 iPerf 文件 然后我可以在手机上运行 iPerf 并收集其输出 但我对自己编译这些文件感兴趣
  • 如何在 Qt 中简单地序列化复杂结构并通过网络发送它们

    我正在创建一个客户端服务器应用程序 现在我正在处理一种最简单的方法来序列化一些类 将其传递到另一端 然后放回到我以后可以使用的类中 我意识到这并不简单 有些人可能会说在 C 或 C 等低级语言中不可能 但实际上通过大量编码是可以实现的 我想
  • 如何使用 Apache Cordova 3.4.0 在本地存储文件

    我在使用 apache cordova 的 文件 插件在 iOS 或 Android 设备上本地存储文件时遇到问题 我认为问题在于正确设置路径 这是我从 Xcode 收到的错误消息无法创建保存下载文件的路径 操作无法完成 可可错误 512
  • Conemu 和 console2 模拟器没有获取新的路径变量

    我想也许这是一个系统问题 但最近做了一个全新的安装 win7 64位 和一个干净的conemu安装 在旧的win32系统上conemu和console2都有同样的问题 此外 我发现研究的所有内容都与通过命令行添加变量有关 我通过 开始 gt
  • Bootstrap 3.0 媒体查询

    我正在开发一个基于 Bootstrap 3 html5 样板自定义构建 的小项目 并尝试使用 官方 媒体查询在引导文档中 http getbootstrap com css grid media queries Extra small de
  • 将 sklearn TfidfVectorizer 与已标记化的输入一起使用?

    我有一个标记化句子列表 想要安装 tfidf 矢量器 我尝试了以下方法 tokenized list of sentences this is one this is another def identity tokenizer text
  • 为什么这个 javascript 和 html 代码没有计算结果?

    这是代码
  • 如何使用c#从后台代码中查找SQL Server实例名称和服务器名称? [复制]

    这个问题在这里已经有答案了 可能的重复 SqlDataSourceEnumerator Instance GetDataSources 找不到本地 SQL Server 2008 实例 https stackoverflow com que
  • 基于 HTTPS 的 SOAP 客户端,双方均带有 SSL 证书

    我必须开发一个 SOAP 客户端 供应商向我发送了以下规格 将通过IP使用HTTPS进行传输 并打包为XML文档 以适应不同的XML方案定义 通讯是同步的 第三方需要等待响应 每个请求和响应都将被签名 我正在使用 PHP 中的soapCli
  • 如何启动 IPython 运行脚本?

    我的用例是我想初始化文件中的一些函数 然后使用定义的这些函数启动 IPython 有没有办法做这样的事情 ipython run script myscript py 在最新版本的 IPython 中 您确实需要添加 i之后可以选择进入交互
  • 通过 ssh 远程获取脚本

    我想通过ssh运行一个远程程序 这需要一定的环境 因此 在执行程序之前 我获取了构建环境的特定文件 如果我直接登录到机器上 这没有问题 但是当我通过 ssh 执行命令时 bin bash foo ssh user host source s
  • scala 中的惰性函数定义

    我一直在学习 Scala 我不得不说这是一门非常酷的语言 我特别喜欢它的模式匹配功能和函数文字 但我有 javascript ruby 背景 这些语言中我最喜欢的模式之一是惰性函数和方法定义模式 JavaScript 中的一个例子是 var