仓颉语言实战——1. 类型
仓颉语言实战——1. 类型

仓颉语言(Cangjie Language)是一个现代化的、简洁而强大的编程语言,它的类型系统为高效开发提供了极大的支持。本篇文章将围绕仓颉语言中的类型系统展开,结合实战代码,帮助开发者快速掌握这一核心特性。
还有对应的学习资源哦:

类型简介
类型系统是编程语言的基础之一,在仓颉语言中,类型系统不仅直观,而且支持高度灵活的静态与动态类型定义,具备强大的表达能力。
仓颉语言中的类型可大致分为以下几类:
- 基本类型:如
int,float,bool,string等。 - 复合类型:如
list,tuple,dict。 - 用户自定义类型:通过关键字
type定义。 - 函数类型:类型化的函数签名。
- 泛型类型:支持类型参数的定义和使用。
- 可选类型:通过
Optional实现。 - 联合类型:通过
Union表示多种可能的类型。
接下来,我们通过示例代码逐一介绍这些类型的用法。
可以先在网页端进行在线体验哦:

基本类型
仓颉语言提供了一些基本类型,它们是所有复杂类型的构建基石。
示例代码
# 基本类型示例
let a: int = 42
let b: float = 3.14
let c: bool = true
let d: string = "Hello, Cangjie!"# 输出各类型变量的值和类型
print(a, type(a)) # 输出: 42 int
print(b, type(b)) # 输出: 3.14 float
print(c, type(c)) # 输出: true bool
print(d, type(d)) # 输出: Hello, Cangjie! string
说明
int表示整型,支持标准数学运算。float表示浮点型,支持小数表示与计算。bool表示布尔型,值为true或false。string表示字符串类型,支持 Unicode 字符集。
复合类型
复合类型允许开发者将多个值组织在一起,支持更复杂的数据结构。
列表(List)
列表是一种有序的可变集合类型。
# 定义一个整数列表
let numbers: list[int] = [1, 2, 3, 4, 5]# 向列表添加元素
numbers.append(6)
print(numbers) # 输出: [1, 2, 3, 4, 5, 6]# 遍历列表
for num in numbers:print(num)
元组(Tuple)
元组是一种有序的不可变集合类型。
# 定义一个混合类型的元组
let info: tuple[string, int, bool] = ("Alice", 30, true)# 访问元组元素
print(info[0]) # 输出: Alice
print(info[1]) # 输出: 30
print(info[2]) # 输出: true
字典(Dict)
字典是一种键值对映射类型。
# 定义一个字典
let person: dict[string, string] = {"name": "Alice","city": "Beijing"
}# 访问字典
print(person["name"]) # 输出: Alice# 添加新键值对
person["age"] = "30"
print(person) # 输出: {"name": "Alice", "city": "Beijing", "age": "30"}
用户自定义类型
仓颉语言允许开发者通过 type 关键字定义自己的类型,以增强代码的可读性和复用性。
示例代码
# 定义一个用户自定义类型
type Person = {name: string,age: int,is_student: bool
}# 使用自定义类型
let alice: Person = {name: "Alice",age: 25,is_student: false
}print(alice.name) # 输出: Alice
说明
- 自定义类型使用
type关键字定义。 - 支持嵌套其他类型,例如基本类型和复合类型。
函数类型
函数也是一种类型,在仓颉语言中可以通过类型签名进行定义。
示例代码
# 定义一个带类型签名的函数
let add: (int, int) -> int = func(x: int, y: int) -> int {return x + y
}# 调用函数
print(add(10, 20)) # 输出: 30
说明
- 函数类型签名格式为
(参数类型1, 参数类型2, ...) -> 返回类型。 - 通过函数类型签名,可以对函数参数和返回值进行静态检查。
泛型类型
泛型类型使得代码更加通用化,可以在类型定义中使用类型参数。
示例代码
# 定义一个泛型函数
let reverse: <T>(list[T]) -> list[T] = func(items: list[T]) -> list[T] {return items[::-1]
}# 调用泛型函数
print(reverse([1, 2, 3])) # 输出: [3, 2, 1]
print(reverse(["a", "b", "c"])) # 输出: ["c", "b", "a"]
说明
- 泛型通过
<T>的形式声明类型参数。 - 可以用于函数、类型定义等多种场景。
可选类型
可选类型允许某个值既可以是某种类型,也可以是 None。
示例代码
let find_name: func(id: int) -> Optional[string] = func(id: int) -> Optional[string] {if id == 1:return "Alice"return None
}print(find_name(1)) # 输出: Alice
print(find_name(2)) # 输出: None
说明
- 可选类型使用
Optional[T]表示。 - 可以用来表示可能为空的值。
联合类型
联合类型允许变量可以是多种类型之一。
示例代码
let data: Union[int, string] = 42
print(data) # 输出: 42data = "Hello"
print(data) # 输出: Hello
说明
- 联合类型通过
Union[T1, T2, ...]定义。 - 常用于动态场景。
总结
仓颉语言的类型系统强大而灵活,从基本类型到泛型、可选类型和联合类型,它们构建了一个丰富而强大的开发生态。通过合理使用这些类型特性,可以编写出更加健壮、可维护的代码。
本篇文章介绍了仓颉语言中的主要类型及其用法。接下来我们将在后续文章中深入探讨仓颉语言的其他特性,敬请期待!
第三方仓库:三方库
希望通过本篇文章,您对仓颉语言的类型系统有了更深入的理解。如果您有任何疑问或建议,欢迎留言讨论!通过这篇博客,我们详细探讨了仓颉语言的函数特性及其结构类型的强大功能,结合实际示例,展示了如何灵活使用这些特性来编写模块化、可扩展的代码。

相关文章:
仓颉语言实战——1. 类型
仓颉语言实战——1. 类型 仓颉语言(Cangjie Language)是一个现代化的、简洁而强大的编程语言,它的类型系统为高效开发提供了极大的支持。本篇文章将围绕仓颉语言中的类型系统展开,结合实战代码,帮助开发者快速掌握这一…...
AWTK 在全志 tina linux 上支持 2D 图形加速
全志 tina linux 2D 图形加速插件。 开发环境为 全志 Tina Linux 虚拟机。 1. 准备 下载 awtk git clone https://github.com/zlgopen/awtk.git下载 awtk-linux-fb git clone https://github.com/zlgopen/awtk-linux-fb.git下载 awtk-tina-g2d git clone https://github.co…...
MySql幻读问题
认识具有反复性。 之前以为理解了幻读,最近看黑马的mysql教程以为再次加深了认识。然而现在认为之前的理解都是错误的,而且网上很多关于幻读的解释,都不太准确。 关于幻读的最佳解释还是要看官网mysql官网幻读解释 脏读和不可重复读比较好理…...
(南京观海微电子)——GH7009开机黑屏案例分析
一、 现象描述: 不良现象: LVDS模组,开机大概2秒后就黑屏。 二、问题分析 等主机进入Kernel 后做以下测试: 1、手动reset LCM 后 可以显示正常; 总结: 1)uboot 部分HS 太窄,仅有4个clk宽度&am…...
【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例: m…...
前端学习DAY28(水平)
元素水平方向的布局 元素在其父元素中水平方向的位置有以下几个属性共同决定 margin-left border-left padding-left width padding-right border-right margin-right 一个元素在其父元素中,水平布局必须要满足以下的等式 margin-left border-left …...
【MyBatis】day01搭建MyBatis框架
目录 第一章 初识Mybatis 第二章 搭建Mybatis框架 第三章 Mybatis核心配置详解【mybatis-config.xml】 第一章 初识Mybatis 1.1 框架概述 生活中“框架” 买房子 笔记本电脑 程序中框架【代码半成品】 Mybatis框架:持久化层框架【dao层】 SpringMVC框架&…...
yolov7算法及其改进
yolov7算法及其改进 1、YOLOV7简介2、ELAN架构设计2.1、Partial Residual Networks2.1.1、Masked Residual Layer2.1.2、Asymmetric Residual Layer 2.2、Cross Stage Partial Networks2.2.1、Cross stage partial operation2.2.2、Gradient flow truncate operation 2.3、Effi…...
spring cloud微服务-OpenFeign的使用
OpenFeign的使用 openFeign的作用是服务间的远程调用 ,比如通过OpenFeign可以实现调用远程服务。 已经有了LoadBalancer为什么还要用openFeign? 在微服务架构中,LoadBalancer和OpenFeign虽然都提供了服务间调用的能力,但它们的设计目的和…...
【汇编】关于函数调用过程的若干问题
1. 为什么需要bp指针? 因为bp是栈帧的起始地址,函数内的局部栈变量,采用相对bp的内存寻址。不能相对于sp,sp是一直在变的。 2. 函数调用过程? 函数开始,先压栈bp,保存父函数栈底指针bp&#…...
针对Kali 系统进行分区设置
手动设置分区 Kali 安装之腾讯云经验遇到坑_腾讯云安装kali-CSDN博客 安装过程中的几处关键点,文字总结如下: ①分区--手动 ②是否创建空的分区表 ---yes ③选择---创建一个新的分区 ④大小--默认-----主分区 ⑤分区类型----系统)一个逻辑分区 ⑥是否…...
C语言简单测试总结
前言 在学C语言之前回顾一下C中的一些知识.选用的是中国大学MOOC中C程序设计(面向对象进阶)中的C语言水平评估测试题. 题目 The keyword "unsigned" can modify the keyword [ B ] A.signed B.long C.long double D.float题解:unsigned是无符号的意识,通常在…...
Android OpenGl(二) Shader
一、Shader 1、什么是Shader,为什么要使用Shder (1)shader运行在gpu上的小程序 (2)以前使用固定管线,但缺点是灵活度不够,无法满足复杂需求,为了解决固定管线的缺点,出…...
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1) 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点,并基于Argo搭建一套完整的DevOps CI/CD服务平台,包括Argo CD…...
【已解决】“Content-Security-Policy”头缺失
1、作用 简称CSP,意为内容安全策略,通过设置约束指定可信的内容来源,降低异源文件攻击,例如:js/css/image等 2、相关设置值 指令名 demo 说明 default-src self cdn.example.com 默认策略,可以应用于js文件/图片…...
win系统B站播放8k视频启用HEVC编码
下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads,根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放,我选择直接屏蔽了 B站设置...
快速理解24种设计模式
简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…...
为什么深度学习和神经网络要使用 GPU?
为什么深度学习和神经网络要使用 GPU? 本篇文章的目标是帮助初学者了解 CUDA 是什么,以及它如何与 PyTorch 配合使用,更重要的是,我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA,我们需要对图…...
Yocto 项目中的交叉编译:原理与实例
Yocto 项目是一个强大的工具集,它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色,它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…...
Python入门:7.Pythond的内置容器
引言 Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器&…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
