首页 > 编程语言 >仓颉编程语言入门 -- Array数组详解

仓颉编程语言入门 -- Array数组详解

时间:2024-08-05 22:26:14浏览次数:15  
标签:arr 编程语言 VArray -- let 数组 类型 Array

仓颉编程语言入门 – Array数组详解

一. 如何创建Array数组

我们可以使用 Array 类型来构造单一元素类型,有序序列的数据。

1.仓颉使用 Array 来表示 Array 类型。T 表示 Array 的元素类型,T 可以是任意类型 , 类似于泛型的概念

var arr:Array<String> = ["你好" , "仓颉"]
var arr1 : Array<Int> = [ 1 , 5 , 8]

2.元素类型不相同的 Array 是不相同的类型,所以它们之间不可以互相赋值。

arr = ar1

3.如果相同类型赋值后会被取代

var arr1 : Array<Int> = [ 1 , 5 , 8]
var arr2 : Array<Int> = [1,9,6,45,4]
arr1 = arr2
println(arr1) // [1, 9, 6, 45, 4]

4.我们可以轻松使用字面量来初始化一个 Array,只需要使用方括号将逗号分隔的值列表括起来即可。

编译器会根据上下文自动推断 Array 字面量的类型。也就是说在定义数组中我们可以直接省略类型 , 类似与Python的定义方法

var arr4 = ["你好"]

但是并不支持存入不同类型的数据 , 会发生编译时期错误

var arr4 = ["你好",1,true]
// The types 'Bool', 'Int64' and 'Struct-String' do not have the smallest common supertype

5.也可以使用构造函数的方式构造一个指定元素类型的 Array。

需要注意的是,当通过 item 指定的初始值初始化 Array 时,该构造函数不会拷贝 item,如果 item 是一个引用类型,构造后数组的每一个元素都将指向相同的引用。

  1. 使用构造创建一个空数组 , 类型为Int64

    let a = Array<Int64>() // Created an empty Array whose element type is Int64
    
  2. 使用另一个数组初始化b

    let b = Array<Int64>(a) // Use another Array to initialize b
    
  3. 创建一个指定长度为3 , 默认值为0 的数组

    let c = Array<Int64>(3, item: 0)
    
  4. 创建一个长度为3 , 元素由函数初始化的数组

    let d = Array<Int64>(3, {i => i + 1}) 
    

二. 如何获取数组对象

当我们需要对 Array 的所有元素进行访问时,可以使用 for-in 循环遍历 Array 的所有元素。

  1. Array 是按元素插入顺序排列的,因此对 Array 遍历的顺序总是恒定的。

    main() {
        let arr = [0, 1, 2]
        for (i in arr) {
            println("The element is ${i}")
        }
    }
    

    编译并执行上面的代码,会输出:

    The element is 0
    The element is 1
    The element is 2
    
  2. 当我们需要知道某个 Array 包含的元素个数时,可以使用 size 属性获得对应信息。

    main() {
        let arr = [0, 1, 2]
        let len = arr.size
        println("The size of array is ${len}")
    }
    

    输出

    The size of array is 3
    
  3. 当我们想访问单个指定位置的元素时,可以使用下标语法访问(下标的类型必须是 Int64)。非空 Array 的第一个元素总是从位置 0 开始的。我们可以从 0 开始访问 Array 的任意一个元素,直到最后一个位置(Array 的 size - 1)。索引值不能使用负数或者大于等于 size,当编译器能检查出索引值非法时,会在编译时报错,否则会在运行时抛异常。

    main() {
        let arr = [0, 1, 2]
        let a = arr[0] // a == 0
        let b = arr[1] // b == 1
        let c = arr[-1] // array size is '3', but access index is '-1', which would overflow
    }
    
  4. 如果我们想获取某一段 Array 的元素,可以在下标中传入 Range 类型的值,就可以一次性取得 Range 对应范围的一段 Array。

    let arr1 = [0, 1, 2, 3, 4, 5, 6]
    let arr2 = arr1[0..5] // arr2 contains the elements 0, 1, 2, 3, 4
    
  5. 当 Range 字面量在下标语法中使用时,我们可以省略 start 或 end。

    当省略 start 时,Range 会从 0 开始;当省略 end 时,Range 的 end 会延续到最后一位。

    let arr1 = [0, 1, 2, 3, 4, 5, 6]
    let arr2 = arr1[..3] // arr2 contains elements 0, 1, 2
    let arr3 = arr1[2..] // arr3 contains elements 2, 3, 4, 5, 6
    

三. 如何修改Array数组

Array 是一种长度不变的 集合类型,因此 Array 没有提供添加和删除元素的成员函数。

但是 Array 允许我们对其中的元素进行修改,同样使用下标语法。

main(): Int64 {

    var arr = [1,3,5]
    println(arr) // [1, 3, 5]
    arr[1] = 10
    println(arr) //[1, 10, 5]

    return 0
}

ps : Array 是引用类型,因此 Array 在作为表达式使用时不会拷贝副本,同一个 Array 实例的所有引用都会共享同样的数据。

​ 因此对 Array 元素的修改会影响到该实例的所有引用。

let arr1 = [0, 1, 2]
let arr2 = arr1
arr2[0] = 3
// arr1 contains elements 3, 1, 2
// arr2 contains elements 3, 1, 2

​ 也就是说 , 当数组作为表达式穿给其他数组的时候 , 其他数组和原数组是共享数据的 , 实质上就是把原数组的地址值传递给了新数组 , 这样的话就会导致新数组的值被修改 , 原数组同样改 变

四. VArray类型

仓颉编程语言引入了值类型数组 VArray<T, N > ,其中 T 表示该值类型数组的元素类型, N> ,其中 T 表示该值类型数组的元素类型, N>,其中T表示该值类型数组的元素类型,N 是一个固定的语法,通过 $ 加上一个 Int64 类型的数值字面量表示这个值类型数组的长度。需要注意的是,VArray<T, $N> 不能省略 <T, $N>,且使用类型别名时,不允许拆分 VArray 关键字与其泛型参数。

type varr1 = VArray<Int64, $3> // Ok
type varr2 = VArray // Error

VArray 可以由一个数组的字面量来进行初始化,左值 a 必须标识出 VArray 的实例化类型:

var a: VArray<Int64, $3> = [1, 2, 3]

同时,它拥有两个构造函数:

// VArray<T, $N>(initElement: (Int64) -> T)
let b = VArray<Int64, $5>({ i => i}) // [0, 1, 2, 3, 4]
// VArray<T, $N>(item!: T)
let c = VArray<Int64, $5>(item: 0) // [0, 0, 0, 0, 0]

除此之外,VArray<T, $N> 类型提供了两个成员方法:

  • 用于下标访问和修改的 [] 操作符方法:

    var a: VArray<Int64, $3> = [1, 2, 3]
    let i = a[1] // i is 2
    a[2] = 4 // a is [1, 2, 4]
    

    下标访问的下标类型必须为 Int64。

  • 用于获取 VArray 长度的 size 成员:

    var a: VArray<Int64, $3> = [1, 2, 3]
    let s = a.size // s is 3
    

    size 属性的类型为 Int64。

标签:arr,编程语言,VArray,--,let,数组,类型,Array
From: https://blog.csdn.net/xiugtt6141121/article/details/140938426

相关文章

  • python十六进制编辑器
    源代码:importtkinterastkfromtkinterimportfiledialogimportstructimportbinasciiimportosclassHexEditor:def__init__(self,master):self.master=masterself.master.title("十六进制编辑器")self.master.configure(bg......
  • 【STM32】TIM定时器
    个人主页TIM定时器一、简介二、基本定时器三、通用定时器1、时钟源选择2、时基单元3、输出比较和输入捕获电路(1)输出比较①PWM波形②通用定时器的输出比较电路③输出模式控制器的逻辑④输出比较基本结构(2)输入捕获①测频率的方法②输入捕获电路③主从触发模式④输入捕......
  • Brave浏览器:开启隐私保护新时代
    今天电脑天空要向大家介绍一款专注隐私安全的浏览器——BraveBrowser,它不仅仅是一个浏览工具,更是你在线隐私的守护者!BraveBrowser是一款免费且开源的网络浏览器,它的核心优势在于其强大的广告和跟踪器阻止功能。想象一下,当你在浏览网页时,那些烦人的广告和隐蔽的跟踪器都被一一......
  • 爬虫:xpath高级使用,bs4使用,bs4-css选择器
    xpath高级使用fromlxmlimportetree#由于本次要格式化的内容是一个文件,所以用parse,如果是一个html格式的字符串就用HTMLhtml=etree.parse('02_xpath.html')#可以连接多个但是每两个之间要用一个管道符来连接#print(html.xpath('//ol/li[@data="one"]/text()|......
  • 高效刷题不再是梦
    不知道大家有没有遇到我去年刷题时遇到的难题困惑:手头资料某一专题的题目明明已经刷完了,却还是感觉自己这一专题知识点不够牢固仍需强化,买太多资料的话又担心贪多嚼不烂,去网上找题的话不仅费时费力,最后题目质量可能还不太行,导致刷题效率低下。如果你跟去年的我有一样的困扰的话......
  • 2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了
    大数据领域正在不断扩大:各类公司每年都在产生更多各种形式的数据。不断增长的数据量和多样性正在推动公司加大对大数据工具和技术的投资,以利用所有这些数据来改进运营、更好地了解客户、更快地交付产品,并通过分析应用程序获得其他业务优势。以下是受欢迎的开源工具和技术,用......
  • 八个合法学习黑客技术软件,让你从萌新到大佬!
    八个合法学习黑客技术软件,让你从萌新到大佬!但是不能乱用哦~所有工具下载方法文章末尾提供01Hackingloops这是一个博客网站,主要面向初级水平的黑客。网站上有许多非常有用的工具以及检验分享,包括渗透测试、测试实践、移动黑客等。02XCTF_OJ一个免费的在线网络安全......
  • python项目学习 mediapipe手势识别 opencv可视化显示
    importcv2importmediapipeimportnumpydefget_angle(vector1,vector2):#角度计算angle=numpy.dot(vector1,vector2)/(numpy.sqrt(numpy.sum(vector1*vector1))*numpy.sqrt(numpy.sum(vector2*vector2)))#cos(angle)=向量的点乘/向量的模angle=nump......
  • 登录相关功能的优化【JWT令牌+拦截器+跨域】
    登录相关功能的优化登录后显示当前登录用户el-dropdown: Element-Theworld'smostpopularVueUIframework<el-dropdownstyle="float:right;height:60px;line-height:60px"><spanclass="el-dropdown-link"style="color:white;font-siz......
  • 医院IT运维解决方案
    医院IT运维解决方案      随着大数据、人工智能等技术融入医疗领域,医院信息化发展的下一阶段目标将是走向智慧医院,而智慧医院离不开大数据分析和数字化运维的支撑。由于医院数据的高商业以及敏感度,医院的信息中心必须确保信息系统的稳定运行,提升医院信息系统的服务质量。客......