自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(6222)
  • 收藏
  • 关注

原创 React Native跨平台鸿蒙开发实战系列(二):Node软件环境安装

本文介绍了在HarmonyOS平台上使用React Native开发应用的环境搭建方案。主要内容包括:1) 基础环境配置,需要Node.js 16+、Java JDK 11、HarmonyOS SDK 3.1+和React Native CLI 0.72+;2) Node.js环境安装步骤,详细说明了Linux环境下Node.js 18.x LTS版本的下载、安装和配置过程;3) Yarn工具的可选安装,阐述了Yarn相较npm的优势,如更快的依赖管理、安全检查和版本锁定。文章为开发者提供了React Na

2025-11-13 21:27:05 608

原创 React Native跨平台鸿蒙开发实战系列(一):React Native基本介绍

React Native是由Facebook开源的跨平台移动应用开发框架,基于JavaScript和React技术栈,支持iOS、Android和鸿蒙系统开发。它通过"一次编写,多处运行"的理念,显著提升开发效率,降低重复工作成本。相比原生开发,React Native兼具跨平台兼容性、接近原生的性能表现以及高效的开发体验(支持热重载),同时还拥有丰富的第三方组件生态。本系列课程将重点介绍如何使用React Native开发适配鸿蒙生态的应用,帮助开发者应对多端适配挑战。

2025-11-13 21:06:13 585

原创 Rust编程从入门到精通 元组结构体、结构体方法和结构体关联函数

本文介绍了Rust中的两种重要数据类型:切片(Slice)和结构体(Struct)。切片是对数据的部分引用,包括字符串切片(&str)和数组切片等使用方式。结构体用于组织相关数据,支持字段命名、元组结构体、方法定义等特性。文章详细讲解了切片的创建语法(..范围操作符)、字符串与&str的区别,以及结构体的定义、实例化、所有权规则和调试输出方法。最后还介绍了如何为结构体定义方法,通过impl块实现面向对象风格的代码组织。

2025-11-09 00:38:04 869

原创 Rust编程从入门到精通 变量与数据交互的方式和垂悬引用(Dangling References)

Rust通过所有权机制高效管理内存,避免了手动管理和垃圾回收的缺点。所有权规则包括:每个值有唯一所有者,超出作用域自动释放,变量交互通过移动或克隆实现。移动转移所有权使原变量无效,克隆则创建数据副本。函数传参和返回值遵循相同规则,引用(租借)允许间接访问但不获取所有权。这种编译时检查机制确保内存安全,无需运行时开销。引用可重新绑定,但不能通过不可变引用修改数据。Rust的所有权系统在保证安全性的同时提供了高效的内存管理方案。

2025-11-09 00:33:22 751

原创 Rust编程从入门到精通 Rust 注释/Rust 循环/for 循环

摘要: Rust 支持两种基本注释方式:单行注释(//)和多行注释(/* */),并提供文档注释(///)用于生成API文档。条件语句if-else不需要括号包裹条件,且条件必须为bool类型,支持使用块表达式实现三元运算效果。循环结构包括while循环、for循环(通过iter()或下标遍历集合)以及loop无限循环(可通过break返回值)。特别的是,Rust没有do-while和C风格的for循环,但提供了更安全的迭代方式。这些语法设计体现了Rust对类型安全和代码明确性的重视。

2025-11-09 00:01:04 566

原创 Rust编程从入门到精通 Rust几种数据类型介绍

本文介绍了Rust语言的基本数据类型和函数特性。数据类型部分详细讲解了整数型(包括有符号/无符号、不同位数)、浮点数型(f32/f64)、布尔型、字符型(支持Unicode)以及复合类型(元组和数组)。函数部分展示了Rust的函数定义语法、参数声明、函数体中的语句与表达式区别,以及返回值类型的显式声明方式。特别强调了Rust不支持++/--运算符,要求函数必须显式声明返回值类型,且表达式块作为函数体时最后一行不加分号才能作为返回值。文章通过多个代码示例直观地展示了各种数据类型的使用方法和函数定义规范。

2025-11-08 23:57:22 472

原创 Rust编程从入门到精通 Rust 输出到命令行如何操作

本文介绍了Rust语言的基础语法和核心概念。主要内容包括:命令行输出的println!和print!宏使用方法;变量声明与可变性控制(let和mut);常量与变量的区别;基本数据类型(i32、f64等);函数定义与返回值;控制流结构(if、loop等);所有权(ownership)和借用(borrowing)机制;结构体(struct)和枚举(enum)的定义与使用;模式匹配(match表达式);错误处理(Result和Option);以及生命周期概念。这些是Rust编程的基础要素,强调内存安全和高效并发是

2025-11-08 23:53:33 635

原创 仓颉从入门到精通 - 动态特性 仓颉反射基本介绍

反射指程序可以访问、检测和修改它本身状态或行为的一种机制。反射这一动态特性有以下的优点:提高了程序的灵活性和扩展性。程序能够在运行时获悉各种对象的类型,对其成员进行枚举、调用等操作。允许在运行时创建新类型,无需提前硬编码。但使用反射调用,其性能通常低于直接调用,因此反射机制主要应用于对灵活性和拓展性要求很高的系统框架上。

2025-11-08 18:41:50 705

原创 仓颉从入门到精通 - 实用案例 快速幂的计算

最后,通过 quote模板生成返回的代码,其中用到哈希表的变量名,以及唯一参数的名称、类型和输入函数的返回类型。因此,实现宏的策略是先后提取标识符和表达式,同时检查中间的关键字是正确的。首先,定义 memoizeFibMap 为一个从 Int64 到 Int64 的哈希表,这里第一个 Int64 对应 fib 的唯一参数的类型,第二个 Int64 对应 fib 返回值的类型。它将已经计算过的子问题的结果存储起来,当同一个子问题再次出现时,可以直接查询表来获取结果,从而避免重复的计算,提高算法的效率。

2025-11-06 19:50:29 683

原创 仓颉从入门到精通 - 使用 --debug-macro 输出宏展开结果

仓颉语言中宏的定义需要放在由 macro package 声明的包中,被 macro package 限定的包仅允许宏定义对外可见,其他声明包内可见。说明:重导出的声明也允许对外可见,关于包管理和重导出的相关概念,请参见包的导入章节。macro package define // 编译 define.cjo 携带 macro 属性public func A() {} // Error, 宏包不允许定义外部可见的非宏定义,此处会报错。

2025-11-06 19:42:26 966

原创 仓颉从入门到精通 - 宏调用中嵌套宏调用

自定义报错接口提供同原生编译器报错一样的输出格式,允许用户报 warning 和 error 两类错误提示信息。diag其参数含义如下:level: 报错信息等级tokens: 报错信息中所引用源码内容对应的 Tokensmessage: 报错的主信息hint: 辅助提示信息参考如下使用示例。return 0。

2025-11-06 13:48:20 626

原创 仓颉从入门到精通 - 节点的组成部分

下面是一个宏定义中包含其他宏调用的例子。$(input)get() {class A {@Propmain() {注意,按照宏定义必须比宏调用点先编译的约束,上述 3 个文件的编译顺序必须是:pkg1 -> pkg2 -> pkg3。$(input)get() {会先被展开成如下代码,再进行编译。

2025-11-06 13:40:21 957

原创 仓颉从入门到精通 - 宏的简介 宏的简介

宏可以理解为一种特殊的函数。一般的函数在输入的值上进行计算,然后输出一个新的值,而宏的输入和输出都是程序本身。在输入一段程序后,输出一段新的程序,这段输出的程序随后用于编译和执行。为了把宏的调用和函数调用区分开来,在调用宏时需使用 @ 加上宏的名称。如下示例代码希望实现在调试过程中打印某个表达式的值,同时打印出表达式本身。显然,dprint 不能被写为常规的函数,因为函数只能获得输入表达式的值,不能获得输入表达式本身。但是,可以将 dprint 实现为一个宏来获取输入表达式的程序片段。

2025-11-06 13:31:00 642

原创 仓颉从入门到精通 - 网络编程概述

网络通信是两个设备通过计算机网络进行数据交换的过程。通过编写软件达成网络通信的行为即为网络编程。仓颉为开发者提供了基础的网络编程功能,在仓颉标准库中,开发者可使用 std 模块下的 socket 包来实现传输层网络通信。在传输层协议中,分为不可靠传输和可靠传输两种,仓颉将其抽象为 DatagramSocket 和 StreamSocket。其中不可靠传输协议常见的是 UDP,可靠传输协议常见的是 TCP,仓颉分别将其抽象为 UdpSocket 和 TcpSocket。

2025-11-06 13:24:34 499

原创 仓颉从入门到精通 - 线程局部变量 ThreadLocal

本章介绍基本的 I/O 概念和文件操作。仓颉编程语言将与应用程序外部载体交互的操作称为 I/O 操作。I 对应输入(Input),O 对应输出(Output)。仓颉编程语言所有的 I/O 机制都是基于数据流进行输入输出,这些数据流表示了字节数据的序列。数据流是一串连续的数据集合,它就像承载数据的管道,在管道的一端输入数据,在管道的另一端就可以输出数据。仓颉编程语言将输入输出抽象为流(Stream)。

2025-11-06 13:20:18 883

原创 仓颉从入门到精通 - 终止线程 终止线程

Lock 提供了一种便利灵活的加锁的方式,同时因为它的灵活性,也可能引起忘记解锁,或者在持有锁的情况下抛出异常不能自动释放持有的锁的问题。当一个线程试图获取一个已被其他线程持有的锁时,该线程会被阻塞,直到锁被释放,该线程才会被唤醒,可重入是指线程获取该锁后可再次获得该锁。在上方示例中,无论是主线程还是新创建的线程,如果在 foo() 中已经获得了锁,那么继续调用 bar() 的话,在 bar() 函数中由于是对同一个 Mutex 进行加锁,因此也是能立即获得该锁的,不会出现死锁。

2025-11-06 13:09:36 562

原创 仓颉从入门到精通 - 常见运行时异常

并发编程是现代编程语言中不可或缺的特性,仓颉编程语言提供抢占式的线程模型作为并发编程机制。线程可以细分为两种不同概念,语言线程和 native 线程。语言线程是编程语言中并发模型的基本执行单位。仓颉编程语言希望给开发者提供一个友好、高效、统一的并发编程界面,让开发者无需关心操作系统线程、用户态线程等差异,因此提供仓颉线程的概念。开发者在大多数情况下只需面向仓颉线程编写并发代码。native 线程指语言实现中所使用到的线程(一般是操作系统线程),它们作为语言线程的具体实现载体。

2025-11-06 13:00:50 973

原创 仓颉第三方组件库csv4cj,助力快速操作excel,打造数据管理“好帮手”

本文介绍了如何利用仓颉语言的第三方库csv4cj高效处理Excel数据操作。csv4cj是一款支持CSV文件读写解析的工具,兼容中文处理,可实现数据导入、批量处理和更新等任务自动化。文章详细说明了通过git submodule方式集成csv4cj库的方法,并介绍了仓颉语言stdx模块的功能及其配置方式。该方案能显著提升Excel数据处理效率,减少人工操作错误,适用于业务报表、数据统计等多种场景。

2025-11-06 11:57:28 20004

原创 仓颉从入门到精通 - 定义异常 定义异常

异常是一类特殊的可以被程序员捕获并处理的错误,是程序执行时出现的一系列不正常行为的统称。例如,数组越界、除零错误、计算溢出、非法输入等。为了保证系统的正确性和健壮性,很多软件系统中都包含大量的代码用于错误检测和错误处理。异常不属于程序的正常功能,一旦发生异常,要求程序必须立即处理,即将程序的控制权从正常功能的执行处转移至处理异常的部分。仓颉编程语言提供了异常处理机制,用于处理程序运行时可能出现的各种异常情况。

2025-11-05 21:26:50 912

原创 仓颉从入门到精通 - 包的导入 使用 import 语句导入其他包中的声明或定义

在仓颉编程语言中,可以通过 import fullPackageName.itemName 的语法导入其他包中的一个顶层声明或定义,fullPackageName 为完整路径包名,itemName 为声明的名字。导入语句在源文件中的位置必须在包声明之后,其他声明或定义之前。package a。

2025-11-05 21:19:48 618

原创 仓颉从入门到精通 - Iterable 和 Collections

随着项目规模的不断扩大,仅在一个超大文件中管理源代码会变得十分困难。这时可以将源代码根据功能进行分组,并将不同功能的代码分开管理,每组独立管理的代码会生成一个输出文件。在使用时,通过导入对应的输出文件使用相应的功能,或者通过不同功能的交互与组合实现更加复杂的特性,使得项目管理更加高效。在仓颉编程语言中,包是编译的最小单元,每个包可以单独输出 AST 文件、静态库文件、动态库文件等产物。每个包有自己的名字空间,在同一个包内不允许有同名的顶层定义或声明(函数重载除外)。一个包中可以包含多个源文件。

2025-11-05 21:14:36 896

原创 仓颉从入门到精通 - 基础 Collection 类型概述

本章介绍仓颉语言中常用的几种基础 Collection 类型,包括 Array、ArrayList、HashSet 和 HashMap。可以在不同的场景中选择适合对应业务的类型:Array:不需要增加和删除元素,但需要修改元素ArrayList:需要频繁对元素增删查改HashSet:希望每个元素都是唯一的HashMap:希望存储一系列的映射关系。

2025-11-05 21:07:52 714

原创 仓颉从入门到精通 - 访问规则 扩展的修饰符

f5 函数所在的扩展包含多个泛型约束,所有的泛型约束均是导出的,故该扩展会被导出。对于直接扩展,当扩展与被扩展的类型在同一个包中,扩展是否导出,由被扩展类型与泛型约束(如果有)的访问修饰符同时决定,当所有的泛型约束都是导出类型(修饰符与导出规则,详见顶层声明的可见性章节)时,该扩展将被导出。示例:假设对同一个类型 E 的两个扩展分别为扩展 1 和扩展 2 ,X 的约束在扩展 1 中比扩展 2 中更严格,那么扩展 1 中的函数和属性对扩展 2 均不可见,反之,扩展 2 中的函数和属性对扩展 1 可见。

2025-11-05 20:54:23 872

原创 仓颉从入门到精通 - 扩展概述 直接扩展

扩展可以为在当前 package 中可见的类型(除函数、元组、接口)添加新功能。当不能破坏被扩展类型的封装性,但希望添加额外的功能时,可以使用扩展。可以添加的功能包括:添加成员函数添加操作符重载函数添加成员属性实现接口扩展虽然可以添加额外的功能,但不能变更被扩展类型的封装性,因此扩展不支持以下功能:扩展不能增加成员变量。扩展的函数和属性必须拥有实现。扩展的函数和属性不能使用 open、override、 redef修饰。扩展不能访问被扩展类型中 private 修饰的成员。

2025-11-05 20:48:12 709

原创 仓颉从入门到精通 - 泛型接口 泛型接口

泛型可以用来定义泛型接口,以标准库中定义的 Iterable 为例,它的成员函数 iterator 需要返回一个 Iterator 类型,这一类型是一个容器的遍历器。 Iterator 是一个泛型接口,Iterator 内部有一个从容器类型中返回下一个元素的 next 成员函数,next 成员函数返回的类型是一个需要在使用时指定的类型,所以 Iterator 需要声明泛型参数。泛型类泛型接口中介绍了泛型接口的定义和使用,本节介绍泛型类的定义和使用。如 Map 的键值对就是使用泛型类来定义的。Map 类型

2025-11-05 20:41:20 663

原创 仓颉从入门到精通 - 子类型关系

在仓颉编程语言中,泛型指的是参数化类型,参数化类型是一个在声明时未知并且需要在使用时指定的类型。类型声明与函数声明可以是泛型的。最为常见的例子就是 Array、Set 等容器类型。在仓颉中,function、class、interface、struct 与 enum 的声明都可以声明类型形参,也就是说它们都可以是泛型的。为了方便讨论,定义如下几个常用的术语:类型形参:一个类型或者函数声明可能有一个或者多个需要在使用处被指定的类型,这些类型就被称为类型形参。

2025-11-05 20:34:02 786

原创 仓颉从入门到精通 - Any 类型 Any 类型

属性可以在 interface、class、struct、enum、extend 中定义。set(v) {}其中使用 prop 声明的 a 和 b 都是属性,a 和 b 的类型都是 Int64。a 是无 mut 修饰符的属性,这类属性有且仅有定义 getter(对应取值)实现。b 是使用 mut 修饰的属性,这类属性必须分别定义 getter(对应取值)和 setter(对应赋值)的实现。

2025-11-05 20:25:04 899

原创 仓颉从入门到精通 - 接口定义 接口定义

一个简单的接口定义如下:接口使用关键字 interface 声明,其后是接口的标识符 I 和接口的成员。接口成员可被 open 修饰符修饰,并且 open 修饰符是可选的。当接口 I 声明了一个成员函数 f 之后,要为一个类型实现 I 时,就必须在该类型中实现一个对应的 f 函数。因为 interface 默认具有 open 语义,所以 interface 定义时的 open 修饰符是可选的。

2025-11-05 19:35:05 978

原创 Rust编程从入门到精通 嵌套路径来消除大量的 use 行

这个 use 语句将 std::collections 中定义的所有公有项引入当前作用域。使用 glob 运算符时请多加小心!如此难以推导作用域中有什么名称和它们是在何处定义的。glob 运算符经常用于测试模块 tests 中,这时会将所有内容引入作用域;我们将在第十一章 “如何编写测试” 部分讲解。glob 运算符有时也用于 prelude 模式;查看 标准库中的文档 了解这个模式的更多细节。

2025-11-02 01:09:38 671

原创 Rust编程从入门到精通 使用 super 开始相对路径

例如,如果我们决定采用示例 7-13 的代码,将 main 函数的行为提取到函数 clarinet_trio 中,并将该函数移动到模块 performance_group中,这时 use 所指定的路径无需变化,如示例 7-15 所示。现在,既可以使用老的全路径方式取得 instrument 模块的项,也可以使用新的通过 use 创建的更短的路径。然而结构体的字段仍是私有的。这么做而不是像示例 7-16 那样通过 use 指定函数的路径,清楚的表明了函数不是本地定义的,同时仍最小化了指定全路径时的重复。

2025-11-02 01:04:57 813

原创 Rust编程从入门到精通 包和 crate 用来创建库和二进制项目

然而,Cargo 的约定是如果在代表包的 Cargo.toml 的同级目录下包含 src 目录且其中包含 main.rs 文件的话,Cargo 就知道这个包带有一个与包同名的二进制 crate,且 src/main.rs 就是 crate 根。这个树展示了模块如何嵌套在其他模块中(比如 woodwind 嵌套在 instrument 中)以及模块如何作为其他模块的子模块的(instrument 和 voice 都定义在sound 中)。从这开始有 sound,这是一个定义于 crate 根中的模块。

2025-11-02 00:49:26 681

原创 Rust编程从入门到精通 if let 简单控制流 包、Crates与模块

现在我们涉及到了如何使用枚举来创建有一系列可列举值的自定义类型。我们也展示了标准库的 Option 类型是如何帮助你利用类型系统来避免出错的。当枚举值包含数据时,你可以根据需要处理多少情况来选择使用 match 或 if let 来获取并使用这些值。你的 Rust 程序现在能够使用结构体和枚举在自己的作用域内表现其内容了。在你的 API 中使用自定义类型保证了类型安全:编译器会确保你的函数只会得到它期望的类型的值。

2025-11-01 19:47:23 895

原创 Rust编程从入门到精通 match 控制流运算符

特别的在这个 Option 的例子中,Rust 防止我们忘记明确的处理 None 的情况,这使我们免于假设拥有一个实际上为空的值,这造成了之前提到过的价值亿万的错误。在这些代码的匹配表达式中,我们在匹配 Coin::Quarter 成员的分支的模式中增加了一个叫做 state 的变量。同样地,值也会通过 match 的每一个模式,并且在遇到第一个 “符合” 的模式时,值会进入相关联的代码块并在执行中被使用。接着匹配分支的代码被执行,所以我们将 i 的值加一并返回一个含有值 6 的新 Some。

2025-11-01 19:38:45 735

原创 Rust编程从入门到精通 枚举和模式匹配

让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能两者都是。IP 地址的这个特性使得枚举数据结构非常适合这个场景,因为枚举值只可能是其中一个成员。

2025-11-01 19:18:02 762

原创 Rust编程从入门到精通 如何实现方法语法

让我们把前面实现的获取一个 Rectangle 实例作为参数的 area 函数,改写成一个定义于 Rectangle 结构体上的 area 方法,如示例 5-13 所示:文件名: src/main.rsprintln!示例 5-13:在 Rectangle 结构体上定义 area 方法为了使函数定义于 Rectangle 的上下文中,我们开始了一个 impl 块(impl 是 implementation 的缩写)。

2025-11-01 19:09:28 935

原创 Rust编程从入门到精通 使用结构体组织相关联的数据

结构体和我们在第三章讨论过的元组类似。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field)。示例 5-1:User 结构体定义。

2025-11-01 19:02:27 517

原创 Rust编程从入门到精通 Slice 类型

所有权、借用和 slice 这些概念让 Rust 程序在编译时确保内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。所有权系统影响了 Rust 中很多其他部分的工作方式,所以我们还会继续讲到这些概念,这将贯穿本书的余下内容。让我们开始第五章,来看看如何将多份数据组合进一个 struct 中。

2025-11-01 18:50:35 602

原创 Rust编程从入门到精通 变量与数据交互的方式(二):克隆

原因是像整型这样的在编译时已知大小的类型被整个存储在栈上,所以拷贝其实际的值是快速的。如果我们 确实 需要深度复制 String 中堆上的数据,而不仅仅是栈上的数据,可以使用一个叫做 clone 的通用函数。可以查看给定类型的文档来确认,不过作为一个通用的规则,任何简单标量值的组合可以是 Copy 的,不需要分配内存或某种形式资源的类型是 Copy 的。不过我们尝试返回它的引用。变量 s 有效的作用域与函数参数的作用域一样,不过当引用离开作用域后并不丢弃它指向的数据,因为我们没有所有权。

2025-11-01 13:21:29 639

原创 Rust编程从入门到精通 如何认识所有权

Rust 的核心功能(之一)是 所有权(ownership)。虽然该功能很容易解释,但它对语言的其他部分有着深刻的影响。所有运行的程序都必须管理其使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。在运行时,所有权系统的任何功能都不会减慢程序。因为所有权对很多程序员来说都是一个新概念,需要一些时间来适应。

2025-11-01 13:08:17 929

原创 Rust编程从入门到精通 注释与使用 loop 重复执行代码

你做到了!这是一个大章节:你学习了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!如果你想要实践本章讨论的概念,尝试构建如下程序:相互转换摄氏与华氏温度。生成 n 阶斐波那契数列。打印圣诞颂歌 “The Twelve Days of Christmas” 的歌词,并利用歌曲中的重复部分(编写循环)。当你准备好继续的时候,让我们讨论一个其他语言中 并不 常见的概念:所有权(ownership)。

2025-11-01 12:57:20 775

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除