仓颉语言实战——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 的五种主要内置容器&…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...