HarmonyOS开发(七):构建丰富页面

1、组件状态管理

1.1、概述

在应用中,界面一般都是动态的。界面会根据不同状态展示不一样的效果。

ArkUI作为一种声明式UI,具有状态驱动UI更新的特点,当用户进行界面交互或有外部事件引起状态改变时,状态的变会会触发组件的自动更新。这个时候南非要通过一个变量来记录状态。当改变态的时候,ArkUI则会自动更新界面中受影响的部分。

ArkUI框架提供了多种管理状态的装饰器来修饰变量,使用这些装饰器修饰的变量即称为状态变量。

在组件范围内传递的状态管理常见场景有如下一些:

场景装饰器
组件内状态管理@State
从父组件单向同步状态到子组件@Prop
与父组件双向同步状态@Link
跨组件层级双向同步状态@Provide和@Consume

注意:在实际应用开发中,应用会根据需要封装数据模型。如果需要观察嵌套类对象属性变化,需要使用@Observed和@ObjectLink装饰器。因为上面表格中所说的装饰器只能观察到对象的第一层属性变化。

1.2、@State:组件内的状态管理

实际开发中由于交互,组件的内容呈现可能产生变化。当需要在组件内使用状态来控制UI的不同呈现方式时,可以使用@State装饰器。

@Entry
@Component
struct StateTest {private i: number = 0;@State text: string = '';build() {Row() {Column() {Button('切换',{type: ButtonType.Capsule, stateEffect: true}).width('50%').fontColor(Color.White).fontSize(16).margin({bottom:15}).onClick(() => {if(this.i % 2 === 0) {this.text = 'Harmony OS';} else {this.text = '鸿蒙系统';}this.i += 1;})Text(this.text).fontSize(16).fontWeight(FontWeight.Bold)}.width('100%')}.height('100%')}
}

上面的例子中,text被修饰为@State,那么它就是一个组件内的状态变量,当这个值变化时,其相应的组件展示也会同时更新。

1.3、@Prop:从父组件单向同步状态

当子组件中的状态依赖于父组件传递过来时,需要使用@Prop装饰器,@Prop修饰的变量可以和其父组件中的状态建立单向同步关系。当父组件中状态变化时,该状态值也会更新至@Prop修饰的变量;对@Prop修饰的变量的修改不会影响其父组件中的状态。

// 子组件 sub.ets
@Component
export struct sub {@Prop text: string;build(){Row(){Column(){Button('修改text值',{type:ButtonType.Capsule, stateEffect: true}).width('50%').margin({bottom:10}).fontSize(16).onClick(()=>{this.text = 'text在子组件中被修改了'})Text(this.text).fontSize(16)}.height(300)}.width('100%').justifyContent(FlexAlign.Center)}
}
// 父组件 PropTest.ets
import { sub } from '../components/sub'
@Entry
@Component
struct PropTest {@State text:string = '父组件中初始值'build() {Row() {Column() {Button('在父组件中修改text',{type:ButtonType.Capsule,stateEffect:true}).width('80%').fontSize(16).margin({bottom:10}).onClick(()=>{this.text = '父组件中修改text的值';})Text(this.text).fontSize(16).margin({bottom:30})sub({text:this.text});}.width('100%')}.height('100%')}
}

 上面的例子在父组件中传递其text值给到子组件的text,当在父组件中修改这个值的时候子组件中相应的值也会同步变化,但是在子组件中修改这个值时,这个修改的结果不会同步到父组件。

@Prop修饰的变量是从父组件传递值来初始化的,所以在子组件中是不可以做本地初始化的只能接收来自父组件的值。

1.4、@Link:父子组件双向同步状态

如果父组件状态需要相互绑定进行双向同步时,可以使用@Link装饰。父亲组件中用于初始化子组件@Link变量的必须是在父组件中定义的状态变量。

// 子组件
@Component
export struct sub {@Link @Watch('OnTextChange') text: string ;@State Tip: string = ''OnTextChange(){if(this.text.indexOf('父组件') >= 0) {this.Tip = '使用父组件中的值';} else {this.Tip = '使用子组件中的值';}}build(){Row(){Column(){Button('修改text值',{type:ButtonType.Capsule, stateEffect: true}).width('50%').margin({bottom:10}).fontSize(16).onClick(()=>{this.text = 'text在子组件中被修改了'})Text(this.text).fontSize(16).margin({bottom:30})Text(`Tip:${this.Tip}`).fontSize(16)}.height(300)}.width('100%').justifyContent(FlexAlign.Center)}
}
// 父组件
import { sub } from '../components/sub'
@Entry
@Component
struct PropTest {@State text:string = '父组件中初始值'build() {Row() {Column() {Button('在父组件中修改text',{type:ButtonType.Capsule,stateEffect:true}).width('80%').fontSize(16).margin({bottom:10}).onClick(()=>{this.text = '父组件中修改text的值';})Text(this.text).fontSize(16).margin({bottom:30})sub({text:$text});}.width('100%')}.height('100%')}
}

说明:

1、在子组件中使用@Link修饰时,它就不可以本地化初始化只能通过父组件提供初始值

2、父组件中在给子组件@Link修饰变量进行初始化时需要使用$表示传递的是一个引用

3、@Watch装饰器其内提供的是一个回调函数,它监控变量的变化情况,当发生变化时会触发这个回调函数

1.5、@Provide和@Consume:跨组件层级双向同步状态

它们是用于与后代组件的双向数据同步,应用于数据在多层级之间的传递场景。

@Provide装饰的变量在祖先节点中,可以理解为被“提供”给后代的状态变量

@Consume装饰的变量是在后代组件中,去消费(绑定)祖先节点提供的变量

相关的特点:

  • @Provide装饰的状态变量自动对其所有后代组件可用,开发者无需多次在组件之间传递变量
  • 后代组件通过@Consume去获取@Provide提供的变量,建立@Provide与@Consume之间的双向数据同步,而@State/@Link则不能在多层级父子组件之间传递
  • @Provide和@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同
// 通过相同的变量名绑定
@Provide a: number = 0;
@Consume a: number;// 通过变量别名绑定
@Provide('a') b: number = 0;
@Consume('a') c: number;
// 后代子组件S2
@Component
export struct S2 {@Consume a:number;build(){Row(){Column(){Text('S2').fontSize(16).fontWeight(FontWeight.Bold).margin({bottom:15})Text(`a = ${this.a}`).fontSize(16).fontWeight(FontWeight.Bold).margin({bottom:15})Button('后代修改a的值',{type:ButtonType.Capsule,stateEffect:true}).width('40%').onClick(() => {this.a += 10;})}}.width('100%').justifyContent(FlexAlign.Center)}}
// 后代子组件S1
import { S2 } from './S2';
@Component
export struct S1 {@Consume a:number;build(){Row(){Column(){Text('S1').fontSize(20).fontWeight(FontWeight.Bold).margin({bottom:15})Text(`a = ${this.a}`).fontSize(16).fontWeight(FontWeight.Bold).margin({bottom:15})Divider()S2()}}.width('100%').justifyContent(FlexAlign.Center)}}
父组件
import { S1 } from '../components/S1'
@Entry
@Component
struct ProvideTest {@Provide a: number = 100build() {Row() {Column() {Button('祖先修改a的值', {type:ButtonType.Capsule,stateEffect:true}).width('50%').margin({bottom:15}).onClick(() => {this.a += 100;})Text(`祖先>a = ${this.a}`).fontSize(24).fontWeight(FontWeight.Bold).margin({bottom:20})Divider()S1()}.width('100%')}.height('100%')}
}

2、Video组件

2.1、Video件用法介绍

Video组件的接口靛达形式为:

Video(value:{src?: string | Resource, currentProgressRate?:number | string | PlaybackSpeed, previewUri?: string | PixelMap | Resource, controller?: VideoController})

这其中包含四个可选参数:src,currentProgressRate,previewUri和controller。

  • src:视频播放源的路径,支持本地或网络路径,如果是网络地址时,需要在module.json5中申请网络权限。在使用本地资源播放时,可以使用的媒体库管理模块medialibrary来查询公共媒体库中的视频文件。
  • currentProgressRate:视频播放倍速,其参数类型是number,取值支持0.75,1.0,1.25,1.75,2.0,默认是.0
  •  previewUri:表示视频未播放时的预览图片路径
  • controller:表示视频控制器

注意:支持的视频格式:mp4,mkv,webm,TS

2.2、Video组件属性

Video支持组件的尺寸设置、位置设置等通用属性外,Video还支持是否静音、是否自动播放、控制栏是否显示、视频显示模式及单个视频是否循环播放五个私有属性。

muted:参数类型为boolean,表示是否静音,默认值是false

autoPlay:参数类型为boolean,表示是否自动播放,默认值是false

controls:参数类型为boolean,控制视频播放的控制栏是否显示,默认值是true

objectFit:参数类型为ImageFit,设置视频显示模式。默认值是Cover

objectFit中显示模式可选值有:Contain,Cover,Auto,Fill,ScaleDown,None

默认情况一使用Cover(保持宽高比进行缩小或放大,使用图片两边都大于或等于显示边界)

loop:参数类型为boolean,控制单个视频是否循环播放。默认值是false

2.3、Video组件回调事件

事件名称功能描述
onStart(event:() => void)播放时触发这个事件
onPause(event:()=> void)暂停时触发这个事件
onFinish(event:()=> void)播放结束时触发这个事件
onError(event:()=> void)播放失败时触发这个事件
onPrepared(callback:(event?:{duration:number}) => void)视频准备完成时触发这个事件,通过duration可以获取视频时长s
onSeeking(callback:(event?:{time:number}) => void)操作进度条过程时上报时间信息,单位为s
onSeeked(callback:(event?:{time:number}) => void)操作进度条完成后上报时间信息,单位为s
onUpdate(callback:(event?:{time:number}) => void)播放进度变化时触发这个事件,单位为s,更新时间间隔为250ms
onFullscreenChange(callback:(event?:{fullscreen:boolean}) => void)在全屏和非全屏播放状态之间切换时触发这个事件

2.4、自定义控制器

Video组件的原生控制器样式相对固定,当需要对其做一些特殊的显示时则可能无法满足,此时则可以自下义控制器。

可以使用Row容器实现整理体的布局,Text组件来显示起始时间和视频总时长,最后通过Slider组件来实现视频进度条的效果

@Component
export struct VidoSlider {...build() {Row(...) {Image(...)Text(...)Slider(...)Text(...)}...}
}

3、弹窗

在日常使用应用时,在做一些风险或敏感操作时,应用会给出一个弹框提示,提示用户是否需要执行这些风险操作。

弹窗是一种模态框,常用来提示用户当前需要关注的信息或操作。由于是模态的用户无法操作其它界面内容。在非必要的情况下不推荐使用弹窗,这会打断用户交互的过程。

ArkUI提供了两类弹窗

  • 确认类:比如警告弹窗 AlertDialog
  • 选择类:包含文本选择窗TextPickerDialog、日期选择窗DatePickerDialog、时间滑动选择窗TimePickerDialog...

除了上述的一些弹框,如不满足业务上的需求,还可以自定义弹窗CustomDialog

3.1、警告窗

AlertDialog,它由三部分组件

  1. 标题:可选择
  2. 内容:显示提示信息
  3. 操作按钮:用户做确认或取消等操作

@Entry
@Component
struct DialogTest {build() {Row() {Column() {Button('点击显示弹窗',{type:ButtonType.Capsule, stateEffect:true}).width('50%').fontSize(16).onClick(() => {AlertDialog.show({title: '提示',  // 标题message: '确定要删除所选择的记录?',  // 内容autoCancel: false,  // 点击遮罩层是否关闭弹窗alignment: DialogAlignment.Bottom,  // 弹窗在竖直方向的对齐方式offset: {dx: 0, dy: -20}, // 弹窗相对alignment位置的偏移量primaryButton: {value: '取消',action: () => {console.info('点击了弹窗的取消按钮');}},secondaryButton: {value: '删除',fontColor: '#D94838',action: () => {console.info('点击了弹窗的删除按钮');}},cancel: () => {console.info('点击遮罩层关闭dailog时回调');}})})}.width('100%')}.height('100%')}
}

 上面这个弹框中有两个按钮,也可以构建只包含一个按钮的确认弹框,这个时候使用confirm响应和按钮回调

@Entry
@Component
struct DialogTest {build() {Row() {Column() {Button('点击显示弹窗',{type:ButtonType.Capsule, stateEffect:true}).width('50%').fontSize(16).onClick(() => {AlertDialog.show({title: '提示',  // 标题message: '确定要删除所选择的记录?',  // 内容autoCancel: false,  // 点击遮罩层是否关闭弹窗alignment: DialogAlignment.Bottom,  // 弹窗在竖直方向的对齐方式offset: {dx: 0, dy: -20}, // 弹窗相对alignment位置的偏移量/*primaryButton: {value: '取消',action: () => {console.info('点击了弹窗的取消按钮');}},secondaryButton: {value: '删除',fontColor: '#D94838',action: () => {console.info('点击了弹窗的删除按钮');}},*/confirm: {value: '确认',fontColor: Color.Blue,action: () => {console.info('点击了确认按钮');}},cancel: () => {console.info('点击遮罩层关闭dailog时回调');}})})}.width('100%')}.height('100%')}
}

3.2、选择类弹窗

选择类弹窗用于方便用户选择相关数据

3.2.1、文本选择弹窗

TextPickerDialog,它是文本滑动选择器弹窗,根据指定的选择范围创建文本选择器,展示在弹窗上。

@Entry
@Component
struct TextPickerTest {@State text: string = ''@State index: number = 0;private lans: string[] = ['C','C++','Java','Typescript','ArkUI']build() {Column() {Text(`你的选择是:${this.text}`).fontSize(18).fontWeight(FontWeight.Bold).fontColor('#4169E1').margin({bottom:15})Button('请选择语言', {type:ButtonType.Capsule,stateEffect:true}).margin({bottom:15}).width('50%').onClick(() => {TextPickerDialog.show({range: this.lans, // 设置文本选择器的选择范围selected: this.index,  // 设置初始选中项的索引值onAccept: (value: TextPickerResult) => {  // 点击弹窗中的“确定”按钮时触发该回调this.text = value.value;this.index = value.index;console.info('TextPickerDialog:onAccept()' + JSON.stringify(value));},onCancel: () => { // 点击弹窗中的“取消”按钮时触发该回调console.info('TextPickerDialog:onCancel()');},onChange: (value: TextPickerResult) => {  //  滑动弹窗中的选择器使当前选中项改变时触发该回调console.info('TextPickerDialog:onChange' + JSON.stringify(value))}})})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}

3.2.2、日期选择弹窗

DatePickerDialog,它是日期滑动选择器弹窗,根据指定的日期范围创建日期滑动选择器,展示在弹窗上。

@Entry
@Component
struct DatePickerTest {@State selectedDate: string = ''build() {Row() {Column() {Text(`你选择的日期是:${this.selectedDate}`).fontSize(18).fontWeight(FontWeight.Bold).fontColor('#4169E1').margin({ bottom: 15 })Button('选择日期', { type: ButtonType.Capsule, stateEffect: true }).width('50%').margin({ bottom: 15 }).onClick(() => {DatePickerDialog.show({start: new Date("1900-1-1"), // 设置选择器的起始日期end: new Date("2023-12-31"), // 设置选择器的结束日期selected: this.selectedDate === '' ? new Date() : new Date(this.selectedDate), // 设置当前选中的日期lunar: false,onAccept: (value: DatePickerResult) => { // 点击弹窗中的“确定”按钮时触发该回调this.selectedDate = `${value.year}-${value.month + 1}-${value.day}`console.info("DatePickerDialog:onAccept()" + JSON.stringify(value))},onCancel: () => { // 点击弹窗中的“取消”按钮时触发该回调console.info("DatePickerDialog:onCancel()")},onChange: (value: DatePickerResult) => { // 滑动弹窗中的滑动选择器使当前选中项改变时触发该回调console.info("DatePickerDialog:onChange()" + JSON.stringify(value))}})})}.width('100%')}.height('100%')}
}

3.3、自定义弹窗

在自定义弹窗中可以自定义弹窗内容,用来构建丰富的弹窗界面。

自定义弹窗可以通过装饰器@CustomDialog定义组件来实现,然后结合CustomDialogController来控制自定义弹窗显示和隐藏。

在resources/base/element/下新增json文件:stringarray.json

{"strarray": [{"name": "hobbies_data","value": [{"value": "Soccer"},{"value": "Badminton"},{"value": "Travelling"}]}]
}

同步在en_US,zh_CN目录下也需要新增

ets目录下新增目录viewmodel目录,并在其下新增一个HobbyBean的数据结构

export default class HobbyBean {label: string;isChecked: boolean;constructor(label:string, isChecked:boolean) {this.label = label;this.isChecked = isChecked}
}

ets目录下新增目录components,并在其下新增CustomDialogWidget.ets

import HobbyBean from '../viewmodel/HobbyBean'
@CustomDialog
export struct CustomDialogWidget {@State hobbyBeans: HobbyBean[] = [];@Link hobbies: string;private controller: CustomDialogController;aboutToAppear(){let context: Context = getContext(this);let manager = context.resourceManager;manager.getStringArrayValue($r('app.strarray.hobbies_data'),(error, hobbyResult)=>{hobbyResult.forEach((hobbyItem:string) =>{let hobbyBean = new HobbyBean(hobbyItem,false);this.hobbyBeans.push(hobbyBean);})})}setHobbiesValue(hobbyBeans: HobbyBean[]) {let hobbiesText: string = '';hobbiesText = hobbyBeans.filter((isCheckItem: HobbyBean) => isCheckItem?.isChecked).map((checkedItem:HobbyBean) => {return checkedItem.label;}).join(',');this.hobbies = hobbiesText;}build(){Column(){Text('兴趣爱好').fontSize(16).fontWeight(FontWeight.Bold).margin({bottom:10}).textAlign(TextAlign.Start)List() {ForEach(this.hobbyBeans,(itemHobby:HobbyBean) => {ListItem(){Row(){Text(itemHobby.label).fontSize(14)Toggle({type: ToggleType.Checkbox,isOn:false}).onChange((isCheck)=>{itemHobby.isChecked = isCheck;})}}},itemHobby => itemHobby.label)}Row() {Button('取消').onClick(() => {this.controller.close();}).width('40%')Button('确定').onClick(() => {this.setHobbiesValue(this.hobbyBeans);this.controller.close();}).width('40%')}}.width('95%')}
}

pages目录下新增一个页面:CustomDialogTest

import { CustomDialogWidget } from '../components/CustomDialogWidget'
import HobbyBean from '../viewmodel/HobbyBean';
@Entry
@Component
struct CustomDialogTest {@State hobbies:string = '';customDialogController: CustomDialogController = new CustomDialogController({builder: CustomDialogWidget({hobbies:$hobbies}),alignment: DialogAlignment.Bottom,customStyle: true,offset: { dx: 0,dy: -20 }});setHobbiesValue(hobbyArray: HobbyBean[]) {}build() {Row() {Column(){Text(this.hobbies).fontSize(16).margin({bottom:15})Button('点击打开').onClick(()=>{this.customDialogController.open();})}.width('100%')}.height('100%')}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023.11.26 关于 Spring Boot 单元测试

目录 单元测试 优势 单元测试的使用 具体步骤 实现不污染数据库 阅读下面文章之前 建议点击下方链接了解 MyBatis 的创建与使用 MyBatis 的配置与使用 单元测试 单元测试 指对软件中的最小可测试单元进行检查和验证的过程单元测试 由开发人员在编码阶段完成,…

数据结构—树

文章目录 9.树(1).树的基本概念#1.基本定义#2.树的广义表表示法#3.基本术语 (2).树的存储结构#1.标准形式(常用)#2.逆存储形式#3.孩子兄弟存储法 (3).并查集#1.我们到底想解决什么问题#2.并查集结点#2.Find(查)#3.Union(并)#4.例子 (4).树的遍历#1.前序遍历#2.后序遍历#3.遍历的…

winform联合halcon读取图像出现问题

1.在Form1.cs和Form.Designer.cs中添加using HalconDotNet; 2. 3.添加Halcon导入.cs的程序 4.注释掉导出文件的主函数,不然会报错。 .

C#常见的设计模式-行为型模式

前言 行为型模式是面向对象设计中的一类设计模式,它关注对象之间的通信和相互作用,以实现特定的行为或功能。在C#中,有许多常见的行为型模式,下面将对其中10种行为型模式进行介绍,并给出相应的代码示例。 目录 前言1.…

ky10 server sp3 解决/boot/grub2/grub.cfg 找不到

现象 /boot/grub2 目录下不存在grub.cfg 配置文件 解决 执行下面脚本即可 yum install -y grub2 grub2-mkconfig -o /boot/grub2/grub.cfg 执行完成第一条命令 执行完成第二条命令 查看效果 已经生成这个文件了

Java抽象类和接口(2)

🐵本篇文章继续对接口相关知识进行讲解 一、排序 1.1 给一个对象数组排序: class Student {public String name;public int age;public Student(String name, int age) {this.name name;this.age age;}public String toString() {return "name:…

BetaFlight模块设计之三十七:SBUS

BetaFlight模块设计之三十七:SBUS 1. 源由2. sbus启动&动态任务3. 主要函数3.1 sbus初始化3.2 sbusFrameStatus更新3.3 rxFrameTimeUs3.4 sbusDataReceive接收数据 4. 辅助函数4.1 sbusChannelsDecode 5. 参考资料 1. 源由 接着BetaFlight模块设计之三十六&…

Leetcode—266.回文排列【简单】Plus

2023每日刷题&#xff08;四十&#xff09; Leetcode—266.回文排列 C语言实现代码 char chara[26] {0};int calculate(char *arr) {int nums 0;for(int i 0; i < 26; i) {nums arr[i];}return nums; }bool canPermutePalindrome(char* s) {int len strlen(s);for(in…

零基础在ubuntu上搭建rtmp服务器-srs

搭建服务器 搭建 SRS&#xff08;Simple-RTMP-Server&#xff09;服务器需要一些步骤&#xff0c;以下是一个简单的步骤指南。请注意&#xff0c;SRS 的配置可能会有所不同&#xff0c;具体取决于你的需求和环境。在开始之前&#xff0c;请确保你的 Ubuntu 系统已经连接到互联…

高效记账,轻松管理,批量记账与柱形图分析助你掌控收支明细

你是否曾经因为繁琐的记账过程而感到烦恼&#xff1f;是否曾经因为无法全面掌握个人或企业的收支情况而感到困惑&#xff1f;现在&#xff0c;我们为你带来了一种全新的高效记账方式&#xff0c;让你从此告别繁琐&#xff0c;轻松掌控收支明细。 首先第一步我们要打开晨曦记账…

商城免费搭建之java商城 鸿鹄云商 B2B2C产品概述

【B2B2C平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级B2B2C电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消费者出发&#xff0c;助…

pytest系列——pytest-xdist插件之多进程运行测试用例|| pytest-parallel插件之多线程运行测试用例

pytest之多进程运行测试用例(pytest-xdist) 前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两…

警惕!AI正在“吞食”你的数据

视觉中国供图 □ 科普时报记者 陈 杰 AI大模型的热度&#xff0c;已然开始从产业向日常生活渗透&#xff0c;并引起不小的舆论旋涡。近日&#xff0c;网友指出国内某智能办软件有拿用户数据“投喂”AI之嫌&#xff0c;引发口水的同时&#xff0c;再度把公众对AI的关注转移到数…

使用paddledetection的记录

首先在这里使用的是是paddle--detection2.7的版本。 成功进行训练 目录&#xff1a; 目录 数据集准备 配置文件的修改 使用的是BML的平台工具&#xff1a; !python -m pip install paddlepaddle-gpu2.5 -i https://mirror.baidu.com/pypi/simple --user %cd /home/aistudio…

Rust语言入门教程(七) - 所有权系统

所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源&#xff0c;也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统&#xff0c;才使得编译器能够提前暴露代码中的错误&#xff0c;并给出我们必要且精准的错误提示。 所有权系统的三个规则…

Anaconda安装教程(超详细版)

目录 一、Anaconda简介 二、运行环境 三、安装Anaconda 四、手动配置环境变量&#xff08;重点&#xff09; 五、测试Anaconda环境是否配置成功 一、Anaconda简介 Anaconda&#xff0c;一个开源的Python发行版本&#xff0c;可用于管理Python及其相关包&#xff0c;包含了…

慕尼黑电子展采访全程 | Samtec管理层对话电子发烧友:虎家卓越服务

【摘要/前言】 今年的慕尼黑上海电子展上&#xff0c;Samtec大放异彩&#xff0c;特装展台一亮相就获得了大家的广泛关注&#xff0c;展台观众络绎不绝。 作为深耕连接器行业数十年的知名厂商以及Electronica的常客&#xff0c;Samtec毫无疑问地获得了大量媒体朋友的关注和报…

【数据结构】二叉树之链式结构

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、前置说明二、二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历 三、…

如何在本地安装部署WinSCP,并实现公网远程本地服务器

可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器 文章目录 可视化文件编辑与SSH传输神器WinSCP如何公网远程本地服务器1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 …

送PDF书 | 豆瓣9.2分,超250万Python新手的选择!蟒蛇书入门到实践

在此疾速成长的科技元年&#xff0c;编程就像是许多人通往无限可能世界的门票。而在编程语言的明星阵容中&#xff0c;Python就像是那位独领风 骚的超级巨星&#xff0c; 以其简洁易懂的语法和强大的功能&#xff0c;脱颖而出&#xff0c;成为全球最炙手可热的编程语言之一。 …