【华为鸿蒙开发技术】结构类型指南之创建 struct 实例与mut 函数

举报
柠檬味拥抱 发表于 2024/07/27 12:18:15 2024/07/27
【摘要】 初识仓颉编程语言仓颉编程语言是一种面向全场景应用开发的通用编程语言,它结合了开发效率和运行性能,致力于为开发者提供优质的编程体验。本文将带您初步了解仓颉编程语言的主要特点、结构定义与实例创建、以及 mut 函数的使用。 主要特点 语法简明高效仓颉编程语言提供了一系列简明高效的语法,旨在减少冗余书写、提升开发效率。例如,插值字符串、主构造函数、Flow 表达式、match、if-let、wh...

初识仓颉编程语言

仓颉编程语言是一种面向全场景应用开发的通用编程语言,它结合了开发效率和运行性能,致力于为开发者提供优质的编程体验。本文将带您初步了解仓颉编程语言的主要特点、结构定义与实例创建、以及 mut 函数的使用。

主要特点

语法简明高效

仓颉编程语言提供了一系列简明高效的语法,旨在减少冗余书写、提升开发效率。例如,插值字符串、主构造函数、Flow 表达式、match、if-let、while-let 和重导出等语法特性让开发者可以用较少的编码表达复杂的逻辑。

多范式编程

仓颉支持函数式、命令式和面向对象等多种编程范式。它融合了高阶函数、代数数据类型、模式匹配、泛型等函数式语言特性,还包括面向对象语言中的封装、接口、继承、子类型多态等特性,以及命令式语言中的值类型和全局函数特性。开发者可以根据具体应用场景选择合适的编程范式。

类型安全与内存安全

作为静态强类型语言,仓颉通过编译时的类型检查,尽早识别程序错误,降低运行时风险。它还具备强大的类型推断能力,减少了类型标注工作。仓颉语言支持自动内存管理,并在运行时进行数组下标越界检查和溢出检查,确保内存安全。

高效并发

仓颉提供了用户态轻量化线程(原生协程)和简单易用的并发编程机制,确保并发场景的高效开发和运行。

兼容语言生态

仓颉支持与 C 语言等主流编程语言的互操作,并采用便捷的声明式编程范式,可以高效复用其他语言库,实现生态兼容。

领域易扩展

仓颉具备基于词法宏的元编程能力,支持编译时代码变换,并提供尾随 lambda、属性、操作符重载等特性,方便开发者定制程序的语法和语义,有助于内嵌式领域专用语言(EDSL)的构建。

助力 UI 开发

仓颉的元编程和尾随 lambda 特性,使其能够构建声明式 UI 开发框架,提升 UI 开发效率和体验。

内置库功能丰富

仓颉提供了涵盖数据结构、常用算法、数学计算、正则匹配、系统交互、文件操作、网络通信、数据库访问、日志打印、解压缩、编解码、加解密和序列化等丰富的内置库。

创建 struct 实例

在仓颉语言中,定义了 struct 类型后,可以通过构造函数来创建 struct 实例。例如,定义一个 Rectangle 类型,并创建其实例:

struct Rectangle {
    public var width: Int64
    public var height: Int64

    public init(width: Int64, height: Int64) {
        this.width = width
        this.height = height
    }

    public func area() {
        width * height
    }
}

main() {
    let r = Rectangle(10, 20) // r.width = 10, r.height = 20
    let a = r.area()          // a = 200
}

如果希望通过 struct 实例修改成员变量的值,需要将 struct 类型的变量定义为可变变量,并且被修改的成员变量也必须是可变成员变量(使用 var 定义):

main() {
    var r = Rectangle(10, 20) // r.width = 10, r.height = 20
    r.width = 8               // r.width = 8
    r.height = 24             // r.height = 24
    let a = r.area()          // a = 192
}

赋值或传参时,会对 struct 实例进行复制,对一个实例的修改不会影响另一个实例:

main() {
    var r1 = Rectangle(10, 20) // r1.width = 10, r1.height = 20
    var r2 = r1                // r2.width = 10, r2.height = 20
    r1.width = 8               // r1.width = 8
    r1.height = 24             // r1.height = 24
    let a1 = r1.area()         // a1 = 192
    let a2 = r2.area()         // a2 = 200
}

mut 函数

struct 类型是值类型,其实例成员函数无法修改实例本身。例如:

struct Foo {
    var i = 0

    public func g() {
        i += 1  // Error, the value of an instance member variable cannot be modified in an instance member function
    }
}

mut 函数是一种可以修改 struct 实例本身的特殊实例成员函数。在 mut 函数内部,this 拥有原地修改字段的能力:

struct Foo {
    var i = 0

    public mut func g() {
        i += 1  // ok
    }
}

mut 函数仅能在 interface、struct 和 struct 的扩展内定义,且不能修饰静态成员函数。mut 函数中的 this 不能被捕获或作为表达式使用:

struct Foo {
    var i = 0

    public mut func f(): Foo {
        let f1 = { => this } // Error, 'this' in mut functions cannot be captured
        let f2 = { => this.i = 2 } // Error, instance member variables in mut functions cannot be captured
        let f3 = { => this.i } // Error, instance member variables in mut functions cannot be captured
        let f4 = { => i } // Error, instance member variables in mut functions cannot be captured
        this // Error, 'this' in mut functions cannot be used as expressions
    }
}

接口中的 mut 函数实例成员函数也可以使用 mut 修饰,且 struct 实现 interface 的函数时必须保持一致的 mut 修饰。struct 实例赋值给 interface 类型时是拷贝语义,因此 interface 的 mut 函数不能修改 struct 实例的值:

interface I {
    mut func f(): Unit
}

struct Foo <: I {
    public var v = 0
    public mut func f(): Unit {
        v += 1
    }
}

main() {
    var a = Foo()
    var b: I = a  
    b.f()  // Calling 'f' via 'b' cannot modify the value of 'a'
    println(a.v) // 0
}

内置库功能与 UI 开发支持

内置库功能丰富

仓颉编程语言的内置库涵盖了许多常用功能,这使得开发者可以方便地使用这些库来完成各种任务。以下是一些主要的内置库功能:

  • 数据结构:提供数组、列表、集合、映射等常用数据结构。
  • 常用算法:包含排序、搜索、哈希等基本算法实现。
  • 数学计算:支持基本的数学运算和高级数学计算。
  • 正则匹配:提供正则表达式的匹配和处理功能。
  • 系统交互:支持与操作系统进行交互,如环境变量获取、进程管理等。
  • 文件操作:提供文件读写、文件路径操作等功能。
  • 网络通信:支持HTTP请求、套接字编程等网络通信功能。
  • 数据库访问:提供对多种数据库的访问支持。
  • 日志打印:提供灵活的日志记录和打印功能。
  • 解压缩:支持常见压缩格式的压缩和解压缩操作。
  • 编解码和加解密:提供常用的编码解码和加解密算法支持。
  • 序列化:支持数据的序列化和反序列化操作。

助力 UI 开发

仓颉编程语言不仅在后端开发上表现出色,在前端 UI 开发方面也有强大的支持。以下是一些关键特性:

  • 元编程:仓颉的元编程能力允许开发者在编译时进行代码变换,这对于构建复杂的 UI 组件和框架非常有用。
  • 尾随 Lambda:这种特性使得在定义 UI 组件时,可以采用更加简洁、直观的声明式语法。
  • 声明式 UI 框架:基于仓颉的这些特性,可以搭建类似 React 或 SwiftUI 的声明式 UI 开发框架,极大提升 UI 开发效率和体验。

下面是一个简单的声明式 UI 开发示例:

struct Button {
    public var label: String
    public var onClick: () -> Unit

    public init(label: String, onClick: () -> Unit) {
        this.label = label
        this.onClick = onClick
    }

    public func render() {
        // 渲染按钮并绑定点击事件
        println("Button: \(label)")
    }
}

main() {
    let button = Button(label: "Click Me", onClick: {
        println("Button clicked!")
    })

    button.render()
}

通过这种声明式的方式,可以大大简化 UI 组件的定义和使用。

示例项目

为了更好地理解仓颉编程语言的强大功能,我们来构建一个简单的示例项目:一个基本的计数器应用。这个应用包括一个按钮和一个标签,点击按钮时,标签显示的计数值增加。

struct CounterApp {
    var count: Int

    public init() {
        this.count = 0
    }

    public mut func increment() {
        count += 1
        render()
    }

    public func render() {
        println("Count: \(count)")
    }
}

struct Button {
    public var label: String
    public var onClick: () -> Unit

    public init(label: String, onClick: () -> Unit) {
        this.label = label
        this.onClick = onClick
    }

    public func render() {
        // 渲染按钮并绑定点击事件
        println("Button: \(label)")
    }
}

main() {
    var app = CounterApp()

    let button = Button(label: "Increment", onClick: {
        app.increment()
    })

    app.render()
    button.render()
    // 模拟按钮点击
    button.onClick()
}

在这个示例中,我们定义了一个 CounterApp 结构体,它包含一个计数值和一个用于增加计数值的 increment 方法。Button 结构体定义了一个按钮,并在 onClick 回调中调用 CounterAppincrement 方法。主函数 main 中创建了 CounterAppButton 的实例,并模拟了按钮点击事件。

结语

仓颉编程语言通过其简洁高效的语法、多范式编程支持、强大的类型安全和内存管理机制,为开发者提供了丰富的功能和良好的编程体验。它在内置库功能、并发编程和 UI 开发方面都有出色的表现,适用于各种应用场景。通过本文的介绍,希望您对仓颉编程语言有了更加全面的了解,并能在实际开发中加以应用。期待未来仓颉编程语言能为您的开发工作带来更多便利和效率。

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。