当前位置: 首页 > 编程日记 > 正文

iced 入门一

在这里插入图片描述

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。
📘相关专栏Rust初阶教程go语言基础系列、spring教程等,大家有兴趣的可以看一看
📙Java并发编程系列,设计模式系列、go web开发框架 系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!


简介

本教程的目标是创建一个简单的购物清单应用程序。我们希望允许添加和删除购物清单中的项目。

在编写代码之前,我们必须首先了解 Iced 构建的结构:Elm 架构。它是 GUI 库使用的架构,最初用于 Elm 编程语言。它的核心原则很简单。它围绕三个概念构建:模型、视图和更新。

  • 模型,应用程序的状态。这是将根据用户交互等进行更新的所有数据。它将用于确定我们希望如何呈现 UI。在本教程中,我们将此称为模型或应用程序的状态。
  • 视图,显示 UI 的函数。
  • 更新,可以更新状态的函数。只有在此函数中,才能更新应用程序的状态。

创建新的 Iced 应用程序

首先,我们将用cargo开始一个新建项目。

cargo new iced-t

现在,到新创建的文件夹中的文件,并将 Iced 添加为依赖项。cargo.toml

[package]
name = "iced-t"
version = "0.1.0"
edition = "2021"

[dependencies]
iced = {version = "0.12.1"}

现在,在应用程序的文件夹中,我们会将这些导入添加到您的文件中。我们稍后会解释他们做什么。src/main.rs

use iced::{Element, Sandbox, Settings};
use iced::widget::text;

现在,我们将创建最基本的应用程序。首先,我们必须创建应用程序的主要结构。我们称之为“GroceryList”。现在,我们将其设为空。

struct GroceryList {}

我们还将创建一个枚举,该枚举也将为空。这将用于指导我们的应用程序如何更新我们的状态。我们稍后会详细了解这一点,但现在,让我们创建一个名为“Message”的枚举

#[derive(Debug, Clone)]
enum Message {}

现在我们将实现该特征。这是我们结构体的一个重要特征。我们还将 our 定义为处理应用程序更新的枚举。我们将其写为 .SandboxGroceryListMessagetype Message = Message

impl Sandbox for GroceryList {
	type Message = Message;
	
	/* Initialize your app */
	fn new() -> GroceryList {
		Self {}
	}
	
	/**
	* The title of the window. It will show up on the top of your application window.
	*/
	fn title(&self) -> String {
		String::from("Grocery List App")
	}
	
	fn update(&mut self, message: Self::Message) {
		// Update the state of your app
	}
	
	fn view(&self) -> Element<Self::Message> {
		text("This is where you will show the view of your app")
		.into()
	}
}

最后,我们将把我们的结构添加到函数中并运行它。GroceryListmain

fn main() -> iced::Result {
	GroceryList::run(Settings::default())
}

为了启动我们的应用程序,我们正在实现一个名为“Sandbox”的特征。正如我之前所说,该特征对于运行我们的应用程序很重要。它允许我们使用我们的结构作为状态来启动我们的应用程序。

该特征是另一个称为“Application”的特征的简化版本。 主要用于制作演示或简单的应用程序,因此得名“Sandbox”。

Sandbox new GroceryList

该方法用于初始化我们的 .由于我们对此应用程序没有任何状态,因此此结构为空(目前)。

title

该方法应返回我们选择的字符串。此字符串将用作窗口的标题。对于我的操作系统,标题显示在窗口顶部。您可以将此字符串更改为要显示为标题的任何内容,它对我们的应用程序无关紧要。

update

该方法对我们的应用非常重要。如果你还记得我对 Elm 架构的解释,update 方法用于更新我们应用程序的状态。对应用程序使用的数据进行的所有更改都必须通过更新方法。现在,我们将它留空。

view into Element

方法。我们将在此处显示应用程序的 UI。在这里,我们使用的是之前导入的“文本”小部件。它将显示传入其中的字符串。我们运行该方法将我们的小部件转换为 Iced 。

运行我们的应用程序

为了运行我们的应用程序,我们将像任何其他 Rust 项目一样运行它。在文件夹的根目录中,运行以下命令:

cargo run --release

您应该看到类似于以下内容的内容:

在这里插入图片描述

hello word

我们正在显示文本,但它看起来非常简单。让我们的 UI 更具吸引力。

首先,让我们更新我们的导入。我们将添加一个新的小部件。

use iced::{alignment, Element, Length, Sandbox, Settings};
use iced::widget::{container, text};

接下来,让我们改变我们的方法。view

fn view(&self) -> Element<Self::Message> {
	container(
		text("Hello World")
	)
	.height(Length::Fill)
	.width(Length::Fill)
	.align_x(alignment::Horizontal::Center)
	.align_y(alignment::Vertical::Center)
	.into()
}

让我们分解一下我们刚刚添加的内容。在我们的方法中,我们添加了一个新的小部件,并将我们的小部件放在其中。容器小部件类似于 html 中的容器。它的目的是存储其他元素,在我们的例子中是小部件。与 HTML 不同,容器只能存储一个元素。我们将使用此小部件将文本放在应用程序的中心。

我们还链接了四种方法,这些方法正在设置和更改容器的大小。我们传递属性以将容器设置为尽可能大。接下来,我们设置并告诉我们的容器里面的小部件应该适合在哪里。我们指定元素应居中。

最后,我将更改应用的默认主题。我将通过在我们的结构中添加一个新方法来更改主题。

impl Sandbox for GroceryList {
  // Other methods...
	fn theme(&self) -> iced::Theme {
		iced::Theme::Dark
	}
}

如果再次运行应用程序,它将与此类似。
在这里插入图片描述

物品展示

现在我们的应用程序非常基础。我在本教程前面解释了状态,但目前,这个应用程序没有状态。我们即将改变这一点。我们将对当前应用程序进行两项修改。

  1. 将状态添加到我们的应用程序。
  2. 我们将使用一个外部函数将一堆小部件组合在一起。这有利于保持我们的应用程序模块化。

在main.rs导入以下内容

use iced::{alignment, Element, Length, Sandbox, Settings};
use iced::widget::{container, text, Column, column};

让我们也改变一下结构的定义。我们将添加一个字符串向量来表示购物清单中的物品。这将是我们的状态。.

struct GroceryList {
	grocery_items: Vec<String>
}

为此,我们还将更改方法,以便正确初始化结构。
···rs
impl Sandbox for GroceryList {
fn new() -> GroceryList {
Self {
grocery_items: vec![
“Eggs”.to_owned(),
“Milk”.to_owned(),
“Flour”.to_owned()
]
}
}
// … Other methods
}
···
接下来,我们将创建一个新函数。一个将显示杂货清单的。老实说,没有必要为此功能创建新函数。我们可以将小部件传递到我们的方法中。但是,将我们的代码模块化是一种很好的做法。view
···rs
impl Sandbox for GroceryList {
// …
}

fn items_list_view(items: &Vec) -> Element<'static, Message> {
let mut column = Column::new()
.spacing(20)
.align_items(iced::Alignment::Center)
.width(Length::Fill);

for value in items {
	column = column.push(text(value));
}  

container(
	column
)
.height(250.0)
.width(300)
.into()

}
···
最后,我们将在方法中使用我们的函数。view

fn view(&self) -> Element<Self::Message> {
	
	container(
		items_list_view(&self.grocery_items),
	)
	.height(Length::Fill)
	.width(Length::Fill)
	.align_x(alignment::Horizontal::Center)
	.align_y(alignment::Vertical::Center)
	.into()
}

我们添加了一个新的小部件 .我们在函数中使用这个小部件。

如果运行此应用,它将类似于以下内容:
在这里插入图片描述

添加用户输入

让我们为用户提供一种最终与我们的应用程序交互的方法。我们将添加两种用户输入方式,以及一种 .button,text_input
首先,让我们再次更新我们的导入。

use iced::{alignment, Element, Length, Padding, Sandbox, Settings};
use iced::widget::{button, column, container, row, text, text_input, Column};

现在,我们将再次更新我们的视图方法。

fn view(&self) -> Element<Self::Message> {
	container(
		column!(
			items_list_view(&self.grocery_items),
			row!(
				text_input("Input grocery item", ""),
				button("Submit")
			)
			.spacing(30)
			.padding(Padding::from(30))
		)
		.align_items(iced::Alignment::Center)
	)
	.height(Length::Fill)
	.width(Length::Fill)
	.align_x(alignment::Horizontal::Center)
	.align_y(alignment::Vertical::Center)
	.into()
}

您会注意到我们正在使用一个新的小部件。它与列小部件几乎相同,但是,它不是将项目彼此叠加显示,而是水平显示它们。

我们初始化行的方式与之前创建的列不同。我们使用的是 Iced 库提供的宏。它允许我们初始化一个类似于微初始化向量中项目的方式。因此,我们可以指定将进入我们的每个元素,而无需调用该方法。为 提供了一个类似的宏,我们也在方法中调用它。

如果您运行代码,您将看到与此类似的内容。
在这里插入图片描述

更新

我们介绍了 Elm 架构的两个核心方面,视图和状态。现在终于到了介绍更新的时候了。Iced 将仅允许通过该方法更新状态。update

我们创建了一个名为 的枚举。 将用于让我们知道如何更新应用程序的状态。每个可以接收输入(文本输入、按钮等)的小部件都会发送消息。我们可以定义要发送的消息类型。从小部件发送消息后,我们将在方法中处理这些消息。

在开始之前,让我们更新我们的导入。

use iced::{alignment, widget::{button, column, container, row, scrollable, text, text_input, Column}, Element, Length, Padding, Sandbox, Settings};

接下来,让我们设置要发送和接收的消息。我们将更改枚举。Message

#[derive(Debug, Clone)]
enum Message {
	InputValue(String),
	Submitted,
}

我们还必须对我们的状态做出小小的改变。由于我们将从 接收值,我们必须将这些值存储在某个地方。因此,我们将在结构中添加另一个字段。

struct GroceryList {
    grocery_items: Vec<String>,
    input_value: String
}

而且,像往常一样,我们还必须更改初始化 .GroceryList

/* Initialize your app */
fn new() -> GroceryList {
    Self {
        grocery_items: vec![
            "Eggs".to_owned(), 
            "Milk".to_owned(), 
            "Flour".to_owned()
        ],
        input_value: String::default()
    }
}

现在,让我们更改方法,以便在用户与我们的小部件交互时可以发送这些消息。

fn view(&self) -> Element<Self::Message> {
	container(
		column!(
			items_list_view(&self.grocery_items),
			row!(
				text_input("Input grocery item", &self.input_value)
				.on_input(|value| Message::InputValue(value))
				.on_submit(Message::Submitted), 

				button("Submit")
				.on_press(Message::Submitted)
			)
			.spacing(30)
			.padding(Padding::from(30))
		)
		.align_items(iced::Alignment::Center)
	)
	.height(Length::Fill)
	.width(Length::Fill)
	.align_x(alignment::Horizontal::Center)
	.align_y(alignment::Vertical::Center)
	.into()
}

在这里,我们添加了一些方法,这些方法将在用户与小部件交互时创建消息。对于按钮,我们有发送消息的方法。

对于我们的文本输入,我们有两个交互。 当用户按回车键时调用。我们将发送与单击按钮时发送的消息相同的消息。我们也有方法。此方法在用户键入时触发。我们传递一个回调函数,该函数接受内部的字符串并返回 .此消息将存储字符串,以便我们可以使用该消息更新我们的应用程序。

我们还对输入进行了巧妙的更改,而不是像以前那样在其中传递一个空字符串,而是传递 .我们希望文本输入的值在用户键入时更新,否则,文本输入将卡为空字符串。

fn update(&mut self, message: Self::Message) {
	match message {
		Message::InputValue(value) => self.input_value = value,
		Message::Submitted => {
			self.grocery_items.push(self.input_value.clone());
			self.input_value = String::default(); // Clear the input value
	}
}

我们正在处理我们创建的两条消息。

  • 每当用户将文本添加到我们创建的字段中时,我们都会将其存储为我们创建的字段中的状态。
  • 每当用户提交文本时,我们都希望将该字符串推送到我们的 .我们还希望清除用户输入的先前值,以便小部件可以为空。

在运行项目之前,我们需要对 UI 进行一个小的更改。在我们之前创建的函数中。

fn items_list_view(items: &Vec<String>) -> Element<'static, Message> {

    let mut column = Column::new()
    .spacing(20)
    .align_items(iced::Alignment::Center)
    .width(Length::Fill);

    for value in items {
        column = column.push(text(value));
    }

    scrollable(
        container(
            column
        )
    )
    .height(250.0)
    .width(300)
    .into()
}

我们只需要添加一个小部件来显示购物清单中的商品。此小部件将为用户提供在小部件的内容大于小部件本身时滚动的选项。现在,如果用户添加了大量购物清单项,则用户可以滚动到不可见的清单项。scrollablescrollable

如果你现在运行它,它应该看起来和我们上次运行应用程序时几乎一样,但这次我们实际上可以与它交互。
在这里插入图片描述

删除项目

就像将项目添加到购物清单一样,我们需要一条消息才能删除它们。

#[derive(Debug, Clone)]
enum Message {
    InputValue(String),
    Submitted,
    DeleteItem(usize),
}

我们在变体将被传递一个数字,该数字表示我们要删除的项目的索引。

让我们将此更改添加到我们的方法中。


    fn update(&mut self, message: Self::Message) {
        match message {
            Message::InputValue(value) => self.input_value = value,
            Message::Submitted => {
                self.grocery_items.push(self.input_value.clone());
                self.input_value = String::default(); // Clear the input value
            }
            Message::DeleteItem(item) => {
                self.grocery_items.remove(item);
            },    
        }
    }

此更改很简单。我们只需从向量中删除指定的项目。

现在让我们通过更改 UI 来完成此应用。每个购物清单项旁边都有一个按钮。此按钮将允许我们的用户删除杂货。让我们创建一个名为“grocery_item”的新函数。

fn grocery_item(index: usize, value: &str) -> Element<'static, Message> {
    row!(
        text(value),
        button("Delete")
        .on_press(Message::DeleteItem(index))
    )
    .align_items(iced::Alignment::Center)
    .spacing(30)
    .into()
}

我们将传递我们和字符串切片中每个杂货项的索引。

fn items_list_view(items: &Vec<String>) -> Element<'static, Message> {

    let mut column = Column::new()
    .spacing(20)
    .align_items(iced::Alignment::Center)
    .width(Length::Fill);

    for (index, value) in items.into_iter().enumerate() {
        column = column.push(grocery_item(index, value));
    }

    scrollable(
        container(
            column
        )
    )
    .height(250.0)
    .width(300)
    .into()
}

如果你现在运行它,你应该看到这样的东西。

在这里插入图片描述

代码

use iced::{alignment, widget::{button, column, container, row, scrollable, text, text_input, Column}, Element, Length, Padding, Sandbox, Settings};
struct GroceryList {
	grocery_items: Vec<String>,
    input_value: String,
}
#[derive(Debug, Clone)]
enum Message {
	InputValue(String),
	Submitted,
    DeleteItem(usize),
}
impl Sandbox for GroceryList {
	type Message = Message;
	
	/* 初始化应用 */
    fn new() -> GroceryList {
        Self {
            grocery_items: vec![
                "Eggs".to_owned(), 
                "Milk".to_owned(), 
                "Flour".to_owned()
            ],
            input_value: String::default()
        }
    }
	
	/**
	* 窗口的标题。它将显示在应用程序窗口的顶部。
	*/
	fn title(&self) -> String {
		String::from("Grocery List App")
	}
	
    fn update(&mut self, message: Self::Message) {
        match message {
            Message::InputValue(value) => self.input_value = value,
            Message::Submitted => {
                self.grocery_items.push(self.input_value.clone());
                self.input_value = String::default(); // Clear the input value
            }
            Message::DeleteItem(item) => {
                self.grocery_items.remove(item);
            },    
        }
    }
	fn view(&self) -> Element<Self::Message> {
        container(
            column!(
                items_list_view(&self.grocery_items),
                row!(
                    text_input("Input grocery item", &self.input_value)
                    .on_input(|value| Message::InputValue(value))
                    .on_submit(Message::Submitted), 
    
                    button("Submit")
                    .on_press(Message::Submitted)
                )
                .spacing(30)
                .padding(Padding::from(30))
            )
            .align_items(iced::Alignment::Center)
        )
        .height(Length::Fill)
        .width(Length::Fill)
        .align_x(alignment::Horizontal::Center)
        .align_y(alignment::Vertical::Center)
        .into()
    }
    fn theme(&self) -> iced::Theme {
		iced::Theme::Dark
	}
   
}
// 设置数据排列方式
fn items_list_view(items: &Vec<String>) -> Element<'static, Message> {

    let mut column = Column::new()
    .spacing(20)
    .align_items(iced::Alignment::Center)
    .width(Length::Fill);

    for (index, value) in items.into_iter().enumerate() {
        column = column.push(grocery_item(index, value));
    }

    scrollable(
        container(
            column
        )
    )
    .height(250.0)
    .width(300)
    .into()
}
fn grocery_item(index: usize, value: &str) -> Element<'static, Message> {
    row!(
        text(value),
        button("Delete")
        .on_press(Message::DeleteItem(index))
    )
    .align_items(iced::Alignment::Center)
    .spacing(30)
    .into()
}
fn main() -> iced::Result {
	GroceryList::run(Settings::default())
}

相关文章:

并发编程下的集合:数组寻址、LinkedList、HashMap、ConcurrentHashMap

如果发现hash取模后的数组索引位下无元素则直接新增,若不是空那就说明存在hash冲突,则判断数组索引位链表结构中的第一个元素的key以及hash值是否与新的key一致则直接覆盖,若不一致则判断当前的数组索引下的链表结构是否为红黑树,若为红黑树则走红黑树的新增方法,若不为红黑树则遍历当前链表结构,遍历中发现某个节点元素的next为null是则直接将新元素指针与next进行关联,若在遍历到next为空前判断到,某个节点的key以及key的hash值与新的key与新的keyhash值一致时则走覆盖。

【日常开发之Windows共享文件】Java实现Windows共享文件上传下载

下拉框选择你选择的用户点击添加,然后共享确定。创建一个文件夹然后点击属性界面,点击共享。maven版本存在于SMB协议的兼容问题。首先开启服务,打开控制面板点击程序。点击启用或关闭Windows功能。我这边是专门创建了一个用户。SMB1.0选中红框内的。

rust wasm入门

demo## 编译 Rust 为 WebAssembly在本教程中,我们将使用 Rust 的 npm 包构建工具 wasm-pack 来构建一个 npm 包。

注解annotation

Kubernetes的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的Kubernetes对象添加注解时,必须指定一个前缀。注解(annotation)可以用来向 Kubernetes 对象的 metadata.annotations 字段添加任意的信息。除了使用注解,您也可以将这类信息存放在一个外部的数据库,然而,在使用、分享这些信息的时候,可能会变得难以管理。

Rust XTask 模式介绍与应用

XTask(扩展任务)是一种在Rust项目中定义和执行自定义构建任务的方式。它通过创建一个独立的Rust库或二进制项目来封装这些任务,利用Rust语言的强类型、安全性和跨平台能力,使得构建流程更加健壮、可读和可维护。

ModuleNotFoundError: No module named ‘qcloud_cos‘

是腾讯云提供的一个Python SDK,用于与腾讯云对象存储(COS)服务进行交互。使用pip安装qcloud_cos报以下错误。这个错误表示Python无法找到名为。

替代Druid,HakariCP 为什么这么快?

这次源码探究,真的感觉看到了无数个小细节,无数个小优化,积少成多。平时开发过程中,一些小的细节也一定要“扣”。

需要在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码

通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。public static final PrintStream err“标准”错误输出流。PrintStream 是打印输出流,它继承于FilterOutputStream。第二个用的是用的是char类型,根本不是方法,当要输出方法体的时候,会给你遍历数组。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。诡异的是,如果错了,面试官对你说了一句:你回去看看,

一个合格的Java选手必须要掌握的并发锁知识

Java内置锁:基于Java语法层面(关键词)实现的锁,主要是根据Java语义来实现,最典型的应用就是synchronized。Java显式锁:基于JDK层面实现的锁,主要是根据基于Lock接口和ReadWriteLock接口,以及统一的AQS基础同步器等来实现,最典型的有ReentrantLock。使用方式:synchronized关键字互斥锁主要有作用于对象方法上面,作用于类静态方法上面,作用于对象方法里面,作用于类静态方法里面等4种方式。

Integer.toHexString(b & 0xff)理解以及& 0xff什么意思

首先toHexString传的参数应该是int类型32位,此处传的是byte类型8位,所以前面需要补24个0。然后& 0xff 就是把前面24个0去掉只要后8位。toHexString(b & 0xff)相当于做了一次位的与运算,将前24位字符省略,将后8位保留。是两个十六进制的数,每个f用二进制表示是1111,所以占四位(bit),两个f()占八位(bit),八位(bit)也就是一个字节(byte).这个方法是把字节(转换成了int)以16进制的方式显示。我的理解是这样,如有不对欢迎指正!

使用JavaScript实现复杂功能:一个完整的电商网站搜索功能

随着互联网的发展,电子商务网站已经成为人们购物的重要平台。而在这些网站中,搜索功能无疑是核心功能之一。用户可以通过搜索快速找到他们需要的商品,从而提高购物体验。本文将详细介绍如何使用JavaScript实现一个完整的电商网站搜索功能。

C++并发编程:互斥锁std::mutex和lock_guard的使用

对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。mutex 用于控制多个线程访问共享资源,确保在任意时刻只有一个线程可以访问该资源,避免数据竞争。这确保了同一时刻只有一个线程可以访问被保护的资源,从而防止多线程并发访问导致的数据不一致性。是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。是 C++ 标准库中提供的一种用于多线程同步的互斥锁实现。

上位机图像处理和嵌入式模块部署(qt插件的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 一个软件一般有很多的功能,但是主流程只有一个。但在软件开发的过程当中,一般来说功能是需要不断添加的,但是主流程最好不要轻易修改。这里的插件就相当于各种各样的功能,而主流程就是如何怎么去调用这些插件的功能。所以,今天正好来学一下怎么添加qt插件,个人觉得这部分还是非常重要的。

C程序的内存空间布局(栈、堆、数据区、常量区、代码区)

较详细的介绍了栈、堆、数据区、常量区、代码区

Java中的四种访问权限(private,public,protected,无修饰)

/实体类属性和数据库字段名称不一致//实体类属性和数据库字段名称不一致return id;return age;emp.test();//直接调用public修饰的变量//private修饰的变量进行赋值//调用private修饰的变量1、public修饰符定义的属性和方法通过对象实例化进行调用,2、private修饰的属性通过set、get方法进行调用。

Java中的方法重载和方法重写有什么区别?

Java中的方法重载(Overloading)和方法重写(Overriding)都是面向对象编程中的重要概念,但它们之间有一些区别。方法重载是指在同一个类中,可以定义多个具有相同名称但参数列表不同的方法。这些方法具有不同的参数类型、参数个数或参数顺序。在调用重载方法时,Java编译器会根据传递给方法的参数类型和数量来选择要调用的正确方法。方法重载主要用于解决方法的命名冲突和提高代码的可读性和可维护性。

python基础使用之变量,表达式,语句

PYTHON基础知识系列之变量、表达式、语句

C语言常见面试题:什么是宏,宏的作用是什么?

宏在计算机科学中是一种批量处理程序命令,它是一种抽象的规则或模式,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。在编译时,预处理器会对宏进行展开,即将宏的内容替换到宏所在的位置。以上是宏的一些主要作用,但并不是全部。在实际编程中,根据需要选择是否使用宏以及如何使用宏,以实现更好的代码组织和可读性。,这样就可以计算出a和b的和。这个例子展示了宏的基本用法和作用。在这个例子中,我们定义了一个宏。,用于计算两个数的和。时,预处理器会将其展开为。

python基础小知识:引用和赋值的区别

通过引用,就可以在程序范围内任何地方传递大型对象而不必在途中进行开销巨大的赋值操作。不过需要注意的是,这种赋值仅能做到顶层赋值,如果出现嵌套的情况下仍不能进行深层赋值。赋值与引用不同,复制后会产生一个新的对象,原对象修改后不会影响到新的对象。如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的引用

elementPlust 的el-select在提示框关闭时自动弹出

主要问题就是因为filterable属性,根本解决方案是选中的时候让他失去焦点 el-select有一个visible-change事件,下拉框出现/隐藏时触发。当el-select添加filterable属性时,弹提示窗时,点击确定后,下拉框会自动弹出。console.log('弹窗出select', item)增加了visible-change事件。el-select事件最后增加焦点取消。

Golang 搭建 WebSocket 应用(八) - 完整代码

本文应该是本系列文章最后一篇了,前面留下的一些坑可能后面会再补充一下,但不在本系列文章中了。

Python自动化实战之接口请求的实现

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

C#winform上位机开发学习笔记3-串口助手的信息保存功能添加

上位机开发的系列学习笔记,避免遗忘多记录多补充多优化

前端JS代码中Object类型数据的相关知识

遍历JavaScript中的对象有几种方法,包括使用for…in循环、Object.keys()方法、Object.values()方法和Object.entries()方法。因此前端传入了日期类型数据之后,如果和后台数据库中的数据类型不一致,比如数据库中的日期数据类型格式是。前端传入的Object对象中其中某个字段值是日期类型的数据,则在前端的类型就是一个。,则数据传往后端之前需要做格式类型转换。,它的值是一个中国标准时间,比如。

Rust之旅 - Rust概念、Windows安装、环境配置

本章节介绍Rust概念、Windows安装、环境配置以及最初级的语法。至此,我们就成功的构建了一个Rust程序,并成功在Visual Studio Code里运行了这个程序,万事俱备,我们就可以开始Rust之旅了。资料获取,更多粉丝福利,关注下方公众号获取。

C语言中常用的字符串处理函数和内存操作函数

`memmove(void *destination, const void *source, size_t num)`:将`source`指向的内存块的前`num`个字节移动到`destination`所指向的内存块,即使内存块有重叠部分。返回指向`destination`的指针。- `memcpy(void *destination, const void *source, size_t num)`:将`source`指向的内存块的前`num`个字节复制到`destination`所指向的内存块。

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

最近,表姐遇到了一个挑战:需要从Excel文件中统计出经过分词处理的重复字段,但由于数据隐私问题,这些Excel文件不能外传。这种情况下,直接使用Excel内置功能好像是行不通的,需要借助Python脚本来实现。为了解决这个问题,我写了一个简单的数据分析和自动化办公脚本,以方便使用。想象一下,即使电脑上没有安装Python,也能通过一个简单的EXE文件轻松完成工作,这是多么方便!因此,我决定不仅要写出这个脚本,还要学会如何将其打包成一个独立的EXE文件。这样,无需Python环境的电脑也能直接运行它

深入解析JavaScript的原生原型

在JavaScript中,除了自定义对象,还存在很多由JavaScript语言本身提供的原生对象。这些原生对象同样基于原型继承机制,拥有自己的原型。理解原生对象的原型非常重要,可以让我们正确使用这些内置对象,也有助于进一步理解JavaScript的原型继承系统。本文将详细解析原生对象的原型结构,揭开一些常见原生对象原型的神秘面纱。​学习原生对象的原型关系,有助于我们在日常开发中正确理解和使用这些JavaScript内置对象,避免一些常见陷阱。

深入三目运算符:JavaScript、C++ 和 Python 比较

三目运算符是编程中常用的条件表达式,它允许我们根据条件选择不同的值。我们将通过具体的例子分别介绍 JavaScript、C++ 和 Python 中的三目运算符,以便更好地理解它们的用法和特性。JavaScript 示例// 例子: 根据条件选择不同的值var x = 10;var y = 20;"x 大于 y" : "x 不大于 y";在这个例子中,如果x大于y,则result的值为 “x 大于 y”,否则为 “x 不大于 y”。C++ 示例// 例子: 根据条件选择不同的值。

Java中的4种引用类型,你知道几种?

Java作为一门面向对象的编程语言,内存管理一直是程序员需要关注的重要方面。在Java中,垃圾回收机制负责自动管理内存,而引用类型则是垃圾回收的重要参考。本文将深入讨论Java中的四种引用类型:强引用、弱引用、软引用和虚引用,以及它们在内存管理中的应用和区别。