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

深入探索仓颉编程语言:函数与结构类型的终极指南

引言

仓颉编程语言是一种现代化、语法精炼的编程语言,其设计目标是提供高度的灵活性与高性能的执行效率。函数与结构类型是仓颉语言的两大基础模块,也是开发者需要掌握的核心。本文将详细讲解仓颉语言中函数和结构类型的特性,辅以代码实例和解释,帮助读者深入理解其强大功能。


第一部分:函数

1.1 定义函数

仓颉语言允许多种风格的函数定义方式,支持显式参数类型和自动类型推导。

示例 1:基本函数定义
// 一个简单的求和函数
fn add(a: int, b: int) -> int {return a + b;
}// 自动类型推导
fn greet(name) {print("Hello, " + name);
}
解释:
  • 第一个函数 add 显式指定了参数类型 int 和返回值类型 int
  • 第二个函数省略了参数类型,仓颉编译器会根据调用时的上下文自动推导类型。

1.2 调用函数

调用函数十分直观,无需额外的语法糖,支持位置参数与命名参数调用。

示例 2:函数调用
fn multiply(a: int, b: int) -> int {return a * b;
}let result = multiply(10, 20); // 位置参数调用
print(result);
解释:
  • 通过 multiply(10, 20) 调用函数时,将 1020 传入 ab
  • 使用 let 关键字保存返回结果。

1.3 函数重载

仓颉语言支持基于参数类型和数量的函数重载,这增强了函数的可读性和灵活性。

示例 3:函数重载
// 重载函数
fn display(value: int) {print("Integer: " + value);
}fn display(value: string) {print("String: " + value);
}display(42);      // 输出: Integer: 42
display("Hello"); // 输出: String: Hello
解释:
  • 重载函数 display 接受不同的参数类型(intstring)。
  • 编译器会根据参数类型自动选择合适的函数。

1.4 嵌套函数

仓颉语言允许在函数内部定义嵌套函数,用于实现局部逻辑封装。

示例 4:嵌套函数
fn outer_function(x: int) -> int {fn inner_function(y: int) -> int {return y * y;}return inner_function(x) + x;
}print(outer_function(5)); // 输出: 30 (5*5 + 5)
解释:
  • inner_functionouter_function 的局部函数,仅能在 outer_function 内部使用。
  • 嵌套函数通常用于封装辅助逻辑,避免命名污染。

1.5 Lambda 表达式

Lambda 表达式是一种轻量化的匿名函数,常用于简化代码。

示例 5:Lambda 表达式
let square = |x| x * x;
print(square(4)); // 输出: 16// 高阶函数示例
fn operate(a: int, b: int, func) -> int {return func(a, b);
}let add = |x, y| x + y;
print(operate(5, 3, add)); // 输出: 8
解释:
  • |x| x * x 定义了一个接受参数 x 的匿名函数。
  • Lambda 表达式可以作为参数传递给其他函数,从而实现高阶函数。

1.6 闭包

闭包是可以捕获其外部作用域变量的函数。

示例 6:闭包示例
fn counter() -> fn() -> int {let count = 0;return fn() -> int {count += 1;return count;};
}let my_counter = counter();
print(my_counter()); // 输出: 1
print(my_counter()); // 输出: 2
解释:
  • 闭包 fn() -> int 捕获了外部作用域的变量 count
  • 每次调用闭包时,count 的值都会递增。

1.7 const 函数和常量求值

仓颉语言支持 const 函数,用于在编译期执行计算,提高效率。

示例 7:const 函数
const fn factorial(n: int) -> int {return if n <= 1 { 1 } else { n * factorial(n - 1) };
}const result = factorial(5);
print(result); // 输出: 120
解释:
  • const 函数 factorial 在编译期完成计算,因此运行时无需重复计算。

第二部分:结构类型

2.1 定义 struct 类型

结构类型是仓颉语言中用于组合数据的核心方式。

示例 8:定义和实例化 struct
struct Point {x: int,y: int,
}let p1 = Point { x: 10, y: 20 };
print(p1.x); // 输出: 10
解释:
  • Point 是一个结构类型,包含两个字段 xy
  • 使用 {} 创建结构实例。

2.2 mut 函数与可变结构

仓颉语言允许使用 mut 关键字标记可变字段,从而修改结构内容。

示例 9:mut 函数
struct Counter {value: int,
}impl Counter {fn increment(mut self) {self.value += 1;}
}let mut c = Counter { value: 0 };
c.increment();
print(c.value); // 输出: 1
解释:
  • 使用 mut 标记结构实例 c 为可变。
  • increment 函数修改了结构的字段。

2.3 嵌套结构与方法

支持结构的嵌套定义与方法扩展。

示例 10:嵌套结构
struct Circle {center: Point,radius: int,
}fn area(circle: Circle) -> float {return 3.14 * circle.radius * circle.radius;
}let c = Circle { center: Point { x: 0, y: 0 }, radius: 5 };
print(area(c)); // 输出: 78.5
解释:
  • Circle 嵌套了 Point 类型,实现了多层数据组合。
  • 通过方法 area 计算圆的面积。

2.4 高级功能:泛型结构

仓颉语言支持泛型结构,用于定义通用的数据类型。

示例 11:泛型结构
struct Box<T> {value: T,
}let int_box = Box { value: 42 };
let str_box = Box { value: "Hello" };print(int_box.value); // 输出: 42
print(str_box.value); // 输出: Hello
解释:
  • 泛型 T 允许 Box 结构存储任意类型的数据。
  • 泛型提升了代码的复用性。

:总结

本文深入剖析了仓颉编程语言的基础数据类型及其高级用法,并通过代码示例展示了每种类型的实际应用场景。希望读者能够通过本文掌握仓颉语言的核心思想,并在实践中灵活运用,构建高效优雅的应用程序。

通过以上步骤,相信你已经初步了解了仓颉编程语言的安装和使用。从认识到安装,再到运行第一个程序,这种逐步深入的过程帮助我们感受到仓颉语言的简洁和高效。接下来,你可以尝试编写更复杂的程序,探索仓颉语言的更多功能,例如其高级的函数式编程支持、模块化开发机制和丰富的标准库。如果有什么不懂的,可以私信小编哦!
当然了你如果想和我一起学习仓颉编程这门新语言的话,可以点这里进行深入学习仓颉学习

相关文章:

深入探索仓颉编程语言:函数与结构类型的终极指南

引言 仓颉编程语言是一种现代化、语法精炼的编程语言&#xff0c;其设计目标是提供高度的灵活性与高性能的执行效率。函数与结构类型是仓颉语言的两大基础模块&#xff0c;也是开发者需要掌握的核心。本文将详细讲解仓颉语言中函数和结构类型的特性&#xff0c;辅以代码实例和…...

Java 对象的内存分配机制详解

在 Java 中&#xff0c;对象的内存分配是一个复杂但非常重要的过程。理解对象在堆中的分配方式&#xff0c;尤其是新生代和老年代的区别&#xff0c;对于优化 Java 应用程序的性能至关重要。本文将详细探讨 Java 对象在堆中的分配机制&#xff0c;包括新生代、老年代、Survivor…...

v8引擎垃圾回收

V8引擎垃圾回收机制 v8引擎负责JavaScript的执行。V8引擎具有内置的垃圾回收机制&#xff0c;用于自动管理内存分配和释放 堆与栈 栈空间 栈空间是小而连续的内存空间&#xff0c;主要用于存储局部变量和函数调用的相关信息&#xff0c;同时栈结构是“先进后出”的策略 栈…...

H5st5.0.0协议分析

签名核心&#xff1a;设备注册 5 8 9段签名校验 其中第八段主要收集了一些指纹信息 需要 对应一致 注册核心加密&#xff1a; fp localTk fp - 16位字符串 localTk - 92位字符串 tls指纹检测 py、js纯算皆可调用 注意&#xff1a;仅供学习交流&#xff0c;与作者无关&am…...

明达助力构建智能变电站新体系

背景概述 随着智能电网技术的飞速进步与电力需求的持续增长&#xff0c;变电站作为电力传输网络的核心节点&#xff0c;其运维效率及安全性能对电网的整体稳定运行起着决定性作用。传统的人工巡检和维护手段已难以匹配现代电网对高效性、实时性及智能化管理的迫切需求。因此&a…...

Flink优化----FlinkSQL 调优

目录 FlinkSQL 调优 1 设置空闲状态保留时间 2 开启 MiniBatch 3 开启 LocalGlobal 3.1 原理概述 3.2 提交案例&#xff1a;统计每天每个 mid 出现次数 3.3 提交案例&#xff1a;开启 miniBatch 和 LocalGlobal 4 开启 Split Distinct 4.1 原理概述 4.2 提交案例&…...

机器学习(二)-简单线性回归

文章目录 1. 简单线性回归理论2. python通过简单线性回归预测房价2.1 预测数据2.2导入标准库2.3 导入数据2.4 划分数据集2.5 导入线性回归模块2.6 对测试集进行预测2.7 计算均方误差 J2.8 计算参数 w0、w12.9 可视化训练集拟合结果2.10 可视化测试集拟合结果2.11 保存模型2.12 …...

01.01、判定字符是否唯一

01.01、[简单] 判定字符是否唯一 1、题目描述 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 在这一题中&#xff0c;我们的任务是判断一个字符串 s 中的所有字符是否全都不同。我们将讨论两种不同的方法来解决这个问题&#xff0c;并详细解释每种方法…...

第五届“传智杯”全国大学生计算机大赛(练习赛)水题题解

目录 复读 题目描述 输入格式 输出格式 输入输出 说明/提示 源代码 时钟 题目描述 输入格式 输出格式 输入输出 说明/提示 源代码 平等的交易 题目描述 输入格式 输出格式 输入输出 说明/提示 源代码 清洁工 题目描述 输入格式 输出格式 输入输出…...

iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量

参考链接&#xff1a;苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里&#xff1a; 1.登录开发者中心 Sign In - Apple 2.找到证书设置&#xff1a; Certificate&#xff0c;Identifiers&Profiles > Profiles > 选择对应证书 edit &g…...

推进数字园区建设-成都国际数字影像产业园

在当今数字化浪潮的席卷下&#xff0c;数字园区建设已成为推动区域经济发展、提升产业竞争力的关键举措。成都国际数字影像产业园作为数字产业领域的重要项目&#xff0c;以其独特的发展模式和创新实践&#xff0c;在推进数字园区建设方面取得了显著成效&#xff0c;为数字产业…...

oracle linux8.10+ oracle 23ai安装

介质准备&#xff1a; 数据库23ai https://edelivery.oracle.com 上述网站下载基础版本&#xff0c;本次未使用。 本次是安装了带补丁的版本&#xff1a; Database Release Update 23.6.0.24.10 GoldImage表示带补丁用于直接安装的软件包 查找888.1对应Primary Note for …...

PH热榜 | 2024-12-25

1. Assistive24 标语&#xff1a;为残障人士提供的免费辅助技术 介绍&#xff1a;Assistive24 是一款免费的 Chrome 浏览器扩展程序&#xff0c;可以帮助患有注意力缺陷多动障碍 (ADHD)、阅读障碍 (dyslexia) 和低视力等障碍的用户更方便地浏览网页。它提供语音导航、自定义…...

OpenCV相机标定与3D重建(36)计算两幅图像之间基本矩阵(Fundamental Matrix)的函数findFundamentalMat()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从两幅图像中的对应点计算基本矩阵。 cv::findFundamentalMat 是 OpenCV 中用于计算两幅图像之间基本矩阵&#xff08;Fundamental Matrix&#…...

ZLG嵌入式笔记 | 电源设计避坑(上)

产品上量后&#xff0c;通常都会有降成需求。多年来&#xff0c;接触过不少产品降成案例&#xff0c;在电源上下刀过猛&#xff0c;引发了产品偶发性问题&#xff0c;带来了很不好的负面影响。本文将对这些案例进行总结&#xff0c;提供电源设计参考&#xff0c;确保产品降成不…...

.NET能做什么?全面解析.NET的应用领域

.NET 是由微软开发的一个开源、跨平台的开发框架。它不仅支持构建各种应用程序&#xff0c;还能运行在不同的操作系统上&#xff0c;包括 Windows、Linux 和 macOS。自从 .NET Core 的推出&#xff0c;.NET 成为了一个现代化的开发平台&#xff0c;能够满足企业和开发者日益多样…...

初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 UDP协议 参数解析&#xff1a; 校验和的计算 TCP协议 参数解析&#xff1a; 确认应答机制 超时重传 连接管理 三次握…...

企业如何搭建安全的跨网文件安全交换管理系统

在数字化转型的浪潮中&#xff0c;企业对数据的安全性和流动性提出了前所未有的高要求。特别是在网络隔离的情况下&#xff0c;如何实现跨网的安全、高效的文件交换成为了众多企业迫切需要解决的问题。 这不仅是技术上的挑战&#xff0c;还涉及到企业内部管理流程的优化和安全策…...

2023 年 12 月青少年软编等考 C 语言四级真题解析

目录 T1. 移动路线T2. 公共子序列T3. 田忌赛马T4. 宠物小精灵之收服 T1. 移动路线 此题为 2021 年 12 月四级第一题原题&#xff0c;见 2021 年 12 月青少年软编等考 C 语言四级真题解析中的 T1。 T2. 公共子序列 此题为 2022 年 3 月四级第四题原题&#xff0c;见 2022 年 …...

GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)

记住&#xff0c;年底陪你跨年的不会仅是方便面跟你的闺蜜&#xff0c;还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根实例对象的元素是&#xff08;&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

window 显示驱动开发-如何查询视频处理功能(三)

​D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针&#xff0c;该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...