当前位置: 首页 > news >正文

「Mac玩转仓颉内测版51」基础篇13 - 高阶函数与闭包

本篇详细介绍高阶函数闭包,这是仓颉语言中实现灵活逻辑的关键工具。高阶函数可将函数作为参数或返回值使用,而闭包能捕获其定义域中的变量,并在后续调用中保持状态。这些概念能让代码更加简洁、灵活,并提升复用性。


关键词
  • 高阶函数
  • 闭包
  • 函数作为参数和返回值
  • 捕获变量

一、高阶函数

高阶函数可以接受函数作为参数或将函数作为返回值,在回调、事件处理和逻辑组合中广泛使用。


1.1 函数作为参数
// 定义程序包名称为 cjcDemo
package cjcDemo// 高阶函数 applyTwice:接收函数 fn 和整数 x,将 fn 应用两次并返回结果
func applyTwice(fn: (Int64) -> Int64, x: Int64): Int64 {return fn(fn(x))  // 两次应用 fn
}// 定义增量函数 increment,将输入整数加 1
func increment(n: Int64): Int64 {return n + 1
}// 主函数入口
main(): Int64 {let result = applyTwice(increment, 5)  // 结果为 7(5 + 1 + 1)println("结果: ${result}")  // 输出: 7return 0
}

applyTwice 展示了如何将函数作为参数传递,并多次调用其逻辑。


1.2 函数作为返回值
// 定义程序包名称为 cjcDemo
package cjcDemo// 定义工厂函数 makeAdder,返回一个闭包函数
func makeAdder(increment: Int64): (Int64) -> Int64 {return { x: Int64 => x + increment }  // 返回匿名函数
}// 主函数入口
main(): Int64 {let addFive = makeAdder(5)  // 创建加 5 的闭包let result = addFive(10)  // 结果为 15(10 + 5)println("结果: ${result}")  // 输出: 15return 0
}

这里展示了如何通过高阶函数返回一个匿名函数(闭包)。


二、闭包

闭包是函数或 lambda,从其定义域中捕获变量并保持状态,即使脱离了作用域,变量依然可用。


2.1 捕获变量的闭包示例
// 定义程序包名称为 cjcDemo
package cjcDemo// 创建计数器函数,直接调用闭包以捕获可变变量
func createCounter() {var count = 0  // 初始化可变变量 count// 定义一个内部闭包函数,用于递增 countfunc increment() {count += 1  // 每次调用递增 countprintln("当前计数: ${count}")  // 打印当前 count 值}// 在函数内直接调用闭包,而不是将其返回increment()  // 第一次调用,输出: 当前计数: 1increment()  // 第二次调用,输出: 当前计数: 2increment()  // 第三次调用,输出: 当前计数: 3
}// 主函数,程序入口
main(): Int64 {// 调用 createCounter 函数,执行闭包内部逻辑createCounter()return 0  // 返回 0 表示程序成功执行
}

此示例展示了闭包如何捕获变量,并在多次调用之间保留状态。


2.2 闭包的限制与错误处理
  1. 捕获的变量必须已初始化
func faultyClosure() {var x: Int64let closure = func() { println(x) }  // 错误:x 未初始化x = 10closure()
}
  1. 可变变量的捕获:捕获可变变量时,需注意避免逃逸问题,否则闭包只能在作用域内使用。

三、闭包的实际应用
  1. 回调函数与事件处理:闭包可用于处理异步事件中的状态。
  2. 计数器与缓存:闭包能在多次调用之间保存状态。
  3. 函数组合:通过高阶函数与闭包实现复杂逻辑。

四、闭包的高级概念
  1. 变量捕获的形式

    • 函数参数的默认值可以捕获外部变量。
    • 函数或 lambda可以引用定义域之外的局部变量。
    • 实例成员变量可以通过非成员函数访问。
  2. 非捕获的情况

    • 在闭包内引用的局部变量
    • 形参变量全局变量的访问。
  3. 传递性捕获:如果一个函数调用了捕获可变变量的闭包,该函数也会间接捕获这些变量。


小结

高阶函数与闭包是仓颉语言中重要的工具。高阶函数提高了代码的复用性,而闭包让状态在多次调用之间得以保持。理解它们的特性与限制,能让你编写更简洁、灵活的代码。


下篇预告

下一篇将介绍递归函数与尾递归优化,探讨如何在仓颉语言中实现高效递归调用。


上一篇: 「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门
下一篇: 「Mac玩转仓颉内测版52」基础篇14 - 递归函数与尾递归优化

作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=417
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


相关文章:

「Mac玩转仓颉内测版51」基础篇13 - 高阶函数与闭包

本篇详细介绍高阶函数和闭包,这是仓颉语言中实现灵活逻辑的关键工具。高阶函数可将函数作为参数或返回值使用,而闭包能捕获其定义域中的变量,并在后续调用中保持状态。这些概念能让代码更加简洁、灵活,并提升复用性。 关键词 高阶…...

如何与GPT更高效的问答

与GPT进行高效沟通的关键在于提问的方式。通过合理的提问技巧,可以更清晰地表达需求,从而获得更准确的回答。以下是一些实用的建议,帮助你提升与GPT的交流效率。 1. 使用简单明了的语言: 尽量避免使用复杂的术语和行话&#xff0c…...

【Android】解决 ADB 中 SELinux 设置与 `Failed transaction (2147483646)` 错误

解决 ADB 中 SELinux 设置与 Failed transaction (2147483646) 错误 在使用 ADB 进行开发和调试时,经常会遇到由于 Android 系统安全策略(SELinux)引起的权限问题,尤其是在执行某些操作时,可能会遇到类似 cmd: Failur…...

etcd常用监控

通过部署etcd-exporterPrometheus,然后配置etcd相关告警可以及时发现etcd集群风险 常见监控项目 1. etcd集群无leader Etcd cluster have no leader - alert:EtcdNoLeaderexpr: etcd_server_has_leader 0 for:0mlabels:severity: criticalannotations:summary:Et…...

红日靶场vulnstack 7靶机的测试报告[细节](一)

目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Redis未授权访问漏洞获取web1靶机系统权限 3、获取docker靶机系统权限 ①Laravel框架漏洞利用getshell ②Laravel主机的提权&&docker容器逃逸 提权…...

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer(传输层如何进行分用)分用(Demultiplexing)的定义:TCP/UDP段格式: UDPUDP的特点:UDP Format端口号Trivial File Transfer Protocol…...

【conda/cuda/cudnn/tensorrt】一份简洁的深度学习环境安装清单

🚀本文主要总结一下conda、cuda、cudnn、tensorrt的快速安装。至于nvidia显卡驱动的安装,暂且不提。本文适合有一定反复安装经验的读者😂,方便其快速整理安装思路。 NVIDIA Drivers 🌔01conda ⭐️ 注意,c…...

在C语言中,访问结构体的成员时,什么时候用`.`【符号点】,什么时候用符号`->`?

在C语言中,访问结构体成员时,使用.和->的情况取决于你是否通过结构体指针来访问。 .(点运算符):当你有一个结构体变量时,使用点运算符来访问它的成员。例如: struct Person {char name[50];i…...

Java序列化

Java序列化 简单来说: 序列化是将对象的状态信息转换为可以存储或传输的形式(如字节序列)的过程。在 Java 中,通过序列化可以把一个对象保存到文件、通过网络传输到其他地方或者存储到数据库等。最直接的原因就是某些场景下需要…...

Python 方框消除小游戏

import pygame import random# 初始化pygame pygame.init()# 设置屏幕大小 screen pygame.display.set_mode((800, 600))# 设置标题 pygame.display.set_caption("打砖块")# 定义颜色 WHITE (255, 255, 255) BLACK (0, 0, 0) RED (255, 0, 0) GREEN (0, 255, 0)…...

微软 Phi-4:小型模型的推理能力大突破

在人工智能领域,语言模型的发展日新月异。微软作为行业的重要参与者,一直致力于推动语言模型技术的进步。近日,微软推出了最新的小型语言模型 Phi-4,这款模型以其卓越的复杂推理能力和在数学领域的出色表现,引起了广泛…...

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一,分发器和拦截器 二,分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三,分发器处理同步请求 四,拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…...

前后端跨域问题(CROS)

前端 在src中创建util文件,写request.js文件: request.js代码如下: import axios from axios import { ElMessage } from element-plus;const request axios.create({// baseURL: /api, // 注意!! 这里是全局统一加…...

ctfshow xss

1.web316 看的wp 先在服务器上写一个php文件 <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt", "a");fwrite($log,$time.: . $cookie . "\n");fclose($log); ?> 获取cookie的值&#xff…...

kafka客户端调用

kafka客户端调用 springboot整合kafkajava调用kafka其他问题 springboot整合kafka 手动提交需要在配置文件配置kafka属性 kafka.listener.ack-mode: manual Component public class MyKafkaListener {Autowiredprivate SaslClient saslClient;//监听所有分区KafkaListener(top…...

Linux 中 sftp 命令基本使用

参考链接 sftp 命令_sftp命令-CSDN博客 登录服务器【必须】 # sftp userNamehost # 例如 sftp root8.138.86.224 上传文件到服务器 使用 sftp 命令可以将本地文件上传到远程主机 # put local_file remote_file # 例如&#xff1a; put E://1.mp4 /root/1.mp4 下载文件 使…...

xtu oj 3个矩形与1个正方形

文章目录 回顾前言代码思路 回顾 xtu oj 神经网络xtu oj 1167 逆序数&#xff08;大数据&#xff09;xtu oj 原根xtu oj 不定方程的正整数解xtu oj 最多的可变换字符串xtu oj String Ixtu oj 字母序列xtu oj 分段xtu oj 完全平方数IIxtu oj 连接字符串xtu oj 2021xtu oj 数字x…...

C++ 引用

引用&#xff08;Reference&#xff09;是C语言中用于给变量起别名的特性&#xff0c;是一种轻量级的变量访问方式。通过引用&#xff0c;可以对原变量进行操作而不需要直接访问原变量的内存地址。这一特性极大地增强了代码的简洁性和安全性&#xff0c;同时也在参数传递和返回…...

解决几个常见的ASP.NET Core Web API 中多线程并发写入数据库失败的问题

前言 在ASP.NET Core Web API应用程序中&#xff0c;当多个并发线程同时调用新增用户数据的接口时&#xff0c;可能会遇到数据库写入失败的问题。这个问题通常源于多个线程同时访问数据库时&#xff0c;可能会导致以下情况&#xff1a; 数据库连接池耗尽&#xff1a;每个线程…...

让知识更具生命力

在当今快速发展的技术世界中&#xff0c;技术文档的重要性不言而喻。它不仅是知识传递的有效载体&#xff0c;也是团队协作的基石&#xff0c;更是提升产品竞争力的重要工具。然而&#xff0c;编写出一份清晰、完整且实用的技术文档&#xff0c;对于许多开发者和团队来说并非易…...

批量DWG文件转dxf(CAD图转dxf)——c#插件实现

此插件可将指定文件夹及子文件夹下的dwg文件批量转为dxf文件。 &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载插件&#xff0c;然后输入“dwg2dxf”运行&#xff0c;选择文件夹即可。&#xff09; 生成dxf在此新建的文件夹路径下&#xff0c;包含子文件夹内的…...

《Django 5 By Example》阅读笔记:p561-p613

《Django 5 By Example》学习第 21 天&#xff0c;p561-p613 总结&#xff0c;总计 53 页。 一、技术总结 1.mixins (1)定义(什么是 mixins?) p570&#xff0c;Mixins are a special kind of multiple inheritance for a class. (2)适用场景(为什么使用&#xff1f;) 1)…...

1. 字符串分割

给定一个非空字符串S&#xff0c;其被N个‘-’分隔成N1的子串&#xff0c;给定正整数K&#xff0c;要求除第一个子串外&#xff0c;其余的子串每K个字符组成新的子串&#xff0c;并用‘-’分隔。对于新组成的每一个子串&#xff0c;如果它含有的小写字母比大写字母多&#xff0…...

[SAP ABAP] 将内表数据转换为HTML格式

从sflight数据库表中检索航班信息&#xff0c;并将这些信息转换成HTML格式&#xff0c;然后下载或显示在前端 开发步骤 ① 自定义一个数据类型 ty_sflight 来存储航班信息 ② 声明内表和工作区变量&#xff0c;用于存储表头、字段、HTML内容和航班详细信息以及创建字段目录lt…...

计算机网络-应用层

应用层是咱们日常开发中&#xff0c;最常用到的一层 主要涉及到两种情况&#xff1a; 1.使用大佬们已经创建好的应用层协议&#xff08;后面再讨论&#xff0c;应用层知名的协议有很多&#xff0c;其中的佼佼者就是 HTTP (后面会出单独的文章来讲解)&#xff09;2.自己定义应用…...

SpringEvent 解决 WebUploader 大文件上传解耦问题

一、SpringEvent涉及的相关组件 为了让不熟悉SpringEvent的朋友对Event也有一个大致的印象。这里还是对SpringEvent对象包含的方法和相关组件的应用进行简单的介绍。 1、 事件&#xff08;Event&#xff09; 事件是应用程序中发生的某种事情&#xff0c;可以是用户行为、系统…...

KALI安装操作及过程

以下是在计算机上安装 Kali Linux 的详细教程&#xff1a;&#xff08;通常我直接使用虚拟机&#xff09; 解压虚拟机安装包&#xff0c;直接在虚拟机中打开KALI &#xff08;将内存改为4GB&#xff09; 初始密码账号&#xff1a;kali 一、准备工作 下载 Kali Linux 镜像文件…...

Scala—“==“和“equals“用法(附与Java对比)

Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中&#xff0c; 是一个方法调用&#xff0c;实际上等价于调用 equals 方法。不仅适用于字符串&#xff0c;还可以用于任何类型&#xff0c;并且自动处理 null。 Demo&#xff1a; Java 的 在 J…...

[Flutter] : Clipboard

import package:flutter/material.dart; import package:flutter/services.dart; setData Clipboard.setData(ClipboardData(text: "传入的文字内容")); getData Clipboard.getData(Clipboard.kTextPlain) 记录 &#xff5c; Flutter剪切板-刨根问底做一个可以在后台…...

vue2:v-for实现的el-radio-group选中时显示角标,并自定义选中按钮的字体颜色和背景色

项目中需要实现一组预定义查询,每一个查询按钮在选中时右上角显示一个角标,展示当前查询返回的数据条目。 1、text-color="#3785FF" fill="#E6EAF1" 处理选中时的字体颜色和背景色,如上图,分别为蓝色和浅灰色。 2、badge中:value="selectedRadio…...

Dynamics 365 CRM- 后端

Dynamics 365 CRM 后端插件语法示例 public IPluginExecutionContext context null;//上下文 public IOrganizationServiceFactory serviceFactory null;//组织服务工厂对象 public IOrganizationService service null;//Org服务对象//创建执行上下文 context (IPluginExe…...

电脑显示器选购指南2024

选择显示器是五花八门的显示参数&#xff0c;如何选择&#xff0c;以下给出参数说明&#xff0c;及部分参考&#xff1a; 1. 尺寸和分辨率 尺寸&#xff08;英寸&#xff09; 根据使用距离和用途选择合适的屏幕尺寸&#xff1a; 21-24 英寸&#xff1a;适合小桌面空间、日常…...

机器学习-多元线性回归

文章目录 代码什么是回归任务什么是多元什么是回归什么是多元线性回归表达式何时使用多元线性回归注意损失函数 代码 https://github.com/FULLK/AI_Study/tree/main/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E5%A4%9A%E5%85%83%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92 什么是回归…...

WEB语义化的新探索:浅析LLMs.txt

【引】有人迷恋使用大模型生成各种有趣的内容&#xff0c; 有人沉醉于大模型相关技术的探索&#xff0c;没有对错&#xff0c;只在于你的乐趣所在。 一项名为 llms.txt 的新提案标志了一些非同寻常的东西的出现: 一个Web网站不仅为人类读者服务&#xff0c;而且为人工智能提供服…...

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决&#xff0c;一是同步化供应链消减从需求到供应的放大效应&#xff0c;二是供应链细分&#xff0c;针对不同的客户、不同的需求供应的匹配策略来应对复杂性&#xff0c;更好的满足客户并以最低的总成本来实现。 对…...

RabbitMQ中的Publish-Subscribe模式

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信和解耦系统的关键组件。RabbitMQ 是一个功能强大且广泛使用的开源消息代理&#xff0c;支持多种消息传递模式。其中&#xff0c;Publish/Subscribe&#xff08;发布/订阅&#xff0…...

简单了解一下 Go 语言的构建约束?

​构建约束是一种在 Go 语言中控制源文件编译条件的方法&#xff0c;它可以让您指定某些文件只在特定的操作系统、架构、编译器或 Go 版本下编译&#xff0c;而在其他环境中自动忽略。这样可以方便您针对不同的平台或场景编写不同的代码&#xff0c;实现条件编译的功能。 构建…...

图像融合算法笔记2024 CDTNet

目录 ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 依赖项: trilinear 效果图: 推理代码ok 只支持linux系统: ControlCom-Image-Composition CDTNet-High-Resolution-Image-Harmonization 开源地址: GitHub - bcmi/CDTNet-High-Reso…...

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等&#xff0c;这些和咱们有关系吗&#xff01;&#xff01;不好意思&#xff0c;走错片场了&#xff0c;刚和项目经理在甲方那边吹牛B想想刚刚的大饼&#xff0c;看看支付宝余额&#xff…...

npm、yarn、pnpm三者的异同

这个表格将会说明一切&#xff1a; 特性npmyarnpnpm依赖管理方式扁平化管理&#xff0c;嵌套依赖树&#xff0c;可能重复安装扁平化管理喝符号链接&#xff0c;同版本只能安装一次基于硬链接喝符号链接的内容寻址存储安装速度最慢中等(并行安装)最快(得益于硬链接的复用)磁盘空…...

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…...

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的&#xff0c;例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…...

Android 中 Activity 和 Fragment 的结合使用经典案例

学习笔记 0. 分析 Activity 与 Fragment 的区别&#xff0c;部分使用的差异 上一篇中我们分析了Activity 与 Fragment 的区别&#xff0c;部分使用的差异。 点我跳转上一篇 1. 单个 Activity 中使用多个 Fragment 这是最常见的用法之一&#xff0c;特别是在单屏幕应用中。通…...

Http协议在网站中的体现

文章目录 1. Http协议简介2. 网站中的体现2.1 访问网站2.2 请求2.3 请求头2.4 请求方式2.5 响应 3. 总结 1. Http协议简介 HTTP&#xff08;超文本传输协议&#xff09; 是一种广泛应用于互联网上的应用层协议&#xff0c;用于在Web浏览器和Web服务器之间传输数据。HTTP协议定…...

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…...

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学&#xff0c;让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域&#xff0c;与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…...

黑皮书-计算机科学导论02

目录 第二部分&#xff1a;计算机硬件 第5章计算机组成 5.1中央处理单元 Ⅰ.算数逻辑单元 Ⅱ.控制单元 Ⅲ.寄存器 5.2主存储器 Ⅰ.随机存取存储器(RAM) Ⅱ.只读存储器(ROM) 高速缓冲存储器(Cache) 5.3输入/输出子系统 Ⅰ.非存储设备 Ⅱ.存储设备&#xff08;辅助存…...

React--》如何高效管理前端环境变量:开发与生产环境配置详解

在前端开发中&#xff0c;如何让项目在不同环境下表现得更为灵活与高效&#xff0c;是每个开发者必须面对的挑战&#xff0c;从开发阶段的调试到生产环境的优化&#xff0c;环境变量配置无疑是其中的关键。 env配置文件&#xff1a;通常用于管理项目的环境变量&#xff0c;环境…...

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …...

【数字花园】个人知识库网站搭建:⑤本地构建+云服务器部署数字花园plus

目录 写在前面&#xff1a;数字花园的定义[[数字花园]]网站的构建原理包括三个步骤&#xff1a;[[我的数字花园搭建笔记]] 现在的部署流程一、本地操作详细教程-2.前置步骤&#xff08;前面的文章都提过&#xff09;-1.创建github中转库0. 本地环境配置基础环境&#xff1a;git…...