首页 > 编程语言 >仓颉原生应用编程语言教程(第5期)

仓颉原生应用编程语言教程(第5期)

时间:2024-11-15 14:31:55浏览次数:1  
标签:教程 编程语言 泛型 仓颉 lhs 数组 类型 Array size

泛型

视频:KCKCJY

在现代软件开发中,泛型编程已成为提高代码质量、复用性和灵活性的关键技术。泛型作为一种参数化多态技术,允许开发者在定义类型或函数时使用类型作为参数,从而创建可适用于多种数据类型的通用代码结构。泛型带来的好处包括:
代码复用:能够定义可操作多种类型的通用算法和数据结构,减少代码冗余。
类型安全:支持更多的编译时的类型检查,避免了运行时类型错误,增强了程序的稳定性。
性能提升:由于避免了不必要的类型转换,泛型还可以提高程序执行效率。
仓颉支持泛型编程,诸如函数、struct、class、interface、extend 都可以引入泛型变元以实现功能的泛型化。数组类型在仓颉中就是典型的泛型类型应用,其语法表示为 Array,其中 T 表示了元素的类型,可以被实例化为任何一个具体的类型,例如 Array 或 Array,甚至可以是嵌套数组 Array<Array>,从而可以轻易地构造各种不同元素类型的数组。
除了类型外,我们还可以定义泛型函数。例如我们可以为使用泛型函数来实现任意两个同类型数组的 concat 操作。如下代码所示,我们定义了一个泛型函数 concat,并且它支持任意两个 Array 类型的数组参数,经过处理后返回了一个拼接后的新数组。这样定义的 concat 函数可以应用在 Array、Array、Array<Array> 以及其它任意类型的数组上,实现了功能的通用化。
func concat(lhs: Array, rhs: Array): Array {
let defaultValue = if (lhs.size > 0) {
lhs[0]
} else if (rhs.size > 0) {
rhs[0]
} else {
return []
}
let newArr = Array(lhs.size + rhs.size, item: defaultValue)
// 使用数组切片进行整段拷贝
newArr[0..lhs.size] = lhs
newArr[lhs.size..lhs.size+rhs.size] = rhs
return newArr
}
泛型和接口以及子类型结合使用,还可以让我们对泛型中的类型变元给出具体的约束,从而对可以实例化该类型变元的实际类型做出限制。下面的例子中,我们希望在数组arr查找元素element。虽然我们并不关心数组及其元素的具体类型,但元素类型T必须能够支持判等操作,让我们能够比较数组中的元素与给定元素是否相等。因此,在lookup函数中的where子句中,我们要求T <: Equatable,即类型T必须实现了接口Equatable
func lookup(element: T, arr: Array): Bool where T <: Equatable {
for (e in arr){
if (element == e){
return true
}
}
return false
}
仓颉的泛型类型不支持协变。以数组为例,不同元素类型的数组是完全不相同的类型,它们之间不能互相赋值,哪怕元素类型之间具有父子类型关系也是禁止的。这避免了数组协变导致的类型不安全问题。
如下示例所示,Apple 是 Fruit 的子类,但是变量 a 和变量 b 之间是不能互相赋值的,Array 和 Array 之间没有子类型关系。
open class Fruit {}
class Apple <: Fruit {}

main() {
var a: Array = []
var b: Array = []
a = b // 编译报错
b = a // 编译报错
}

标签:教程,编程语言,泛型,仓颉,lhs,数组,类型,Array,size
From: https://www.cnblogs.com/llkkj/p/18547928

相关文章

  • 【Xftp 8软件下载与安装教程】
    1、安装包「Xmanager、Xshell、Xftp、Xlpd」:链接:https://pan.quark.cn/s/56cdadc855dd提取码:EckX2、安装教程(建议关闭杀毒软件与本地防护设置)1)       双击Xftp-8.0.0055r.exe安装,弹窗安装对话框  2)       点击下一步  3)       选择‘......
  • 精通rust宏系列教程-入门篇
    Rust最令人敬畏和强大的特性之一是它使用和创建宏的能力。不幸的是,用于创建宏的语法可能相当令人生畏,并且对于新开发人员来说,这些示例可能会令人不知所措。我向你保证Rust宏非常容易理解,本文将为你介绍如何创建自己的宏。什么是Rust宏?println!("hello{}",name)如果......
  • springBoot-RabbitMQ 高级特性(保姆级教程,一步一步带你熟悉RabbitMQ 相关高级特性)
    话不多说,看项目整体架构RabbitMQ高级特性保姆级教程好了,下面县开始贴生产者代码:publisher父依赖:<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.7.18</versi......
  • 「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
    本篇将继续讲解PTA平台上的题目L1-003个位数统计,通过对数字的处理与统计,掌握基础的字符串操作与数组计数功能,进一步提升Cangjie编程语言的实际应用能力。关键词PTA刷题数字统计数组操作字符串处理编程技巧一、L1-003个位数统计题目描述:给定一个正整数,统计该数字中......
  • Python小白学习教程从入门到入坑------第三十二课 生成器(语法进阶)
    目录一、生成器generator1.1生成器表达式1.1.1表达式一1.1.2表达式二二、可迭代对象、迭代器、生成器三者之间的关系2.1定义与特性2.2关系与区别一、生成器generator在Python中,生成器(Generators)是一种用于迭代对象的特殊类型函数。它们允许你生成一个序列......
  • Python小白学习教程从入门到入坑------第三十一课 迭代器(语法进阶)
    目录一、可迭代对象Iterable1.1可迭代对象的条件1.2for循环工作原理1.3isinstance()二、迭代器 Iterator2.1 __iter__() 和 __next__()2.2 可迭代对象&迭代器2.2.1定义与特性2.2.2 关系与转换2.2.3应用场景三、迭代器协议(了解即可)四、自定义迭代器类......
  • 【stable diffusion模型】Stability AI出官方教程了,带你轻松玩转Stable Diffusion 3.5
    前言提示(prompt)是有效使用生成式AI图像模型的关键技巧。提示的结构直接影响生成的图像的质量、创造力和准确性。今日凌晨,StabilityAI发布了StableDiffusion3.5的提示指南。该指南提供了StableDiffusion3.5的实用提示技巧,让使用者能够快速准确地完善图像概念,......
  • CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!
    文章目录CTF基础知识一、CTF简介二、CTF赛事介绍三、CTF竞赛模式1.解题模式(Jeopardy)2.攻防模式(Attack-Defense)3.混合模式(Mix)四、CTF竞赛内容国内外著名赛事1、国际知名CTF赛事2、国内知名CTF赛事五、如何学习CTF1、分析赛题2、常规操作3、入门知识推荐书籍零基础网......
  • 2024爆火全网LLM大模型书籍:从零构建大型语言模型,重磅开源教程!!标星20.3K
    自ChatGPT发布以来,大型语言模型(LLM)已经成为推动人工智能发展的关键技术。近期,机器学习和AI研究员、畅销书《Python机器学习》作者SebastianRaschka又写了一本新书——《BuildaLargeLanguageModel(FromScratch)》,旨在讲解从头开始构建大型语言模型的整个过程......
  • 强大的cad绘图软件推荐:AutoCAD 2023中文 AutoCAD 2023激活教程
    AutoCAD2023是由美国Autodesk公司推出的一款计算机辅助设计软件,广泛应用于建筑、机械、航空、电子和地理信息系统等多个领域。这款软件具有强大的二维和三维设计、制图和分析功能,可以帮助用户轻松创建各种复杂的模型。在功能上,AutoCAD2023提供了平面绘图、编辑图形、三维绘......