当前位置: 首页 > news >正文

淄博好的建网站公司/网站建设优化400报价

淄博好的建网站公司,网站建设优化400报价,网站运营可以转行做网站设计吗,seo关键词首页排名代发1 变量声明 var a : Int // 声明整数类型变量 var b : Int 1 // 声明整数类型变量, 同时赋初值为1 var c 1 // 声明整数类型变量, 同时赋初值为1 val d 1 // 声明整数类型常量, 值为1(后面不能改变d的值) 变量命名规范如下。 变量名可以由字母、数字、下划线(_…

1 变量声明

var a : Int // 声明整数类型变量
var b : Int = 1 // 声明整数类型变量, 同时赋初值为1
var c = 1 // 声明整数类型变量, 同时赋初值为1
val d = 1 // 声明整数类型常量, 值为1(后面不能改变d的值)

        变量命名规范如下。

  • 变量名可以由字母、数字、下划线(_)和美元符号($)组成,但是不能以数字开头,且大小写敏感。
  • 不能有空格、@、#、+、-、/ 等符号。
  • 应该使用有意义的名称,达到见名知意的目的,最好以小写字母开头。
  • 不能与 Kotlin 语言的关键字或是基本数据类型重名。

2 基本数据类型

2.1 空类型

        Kotlin 中空类型使用 Unit 表示,等价与 Java 中的 void。

        1)Unit 的定义

public object Unit {override fun toString() = "kotlin.Unit"
}

        2)Unit 作为变量使用

fun main() {var a : Unit = Unitprintln(a) // kotlin.Unit
}

        3)Unit 作为函数返回值使用

fun myFun() : Unit {println("定义一个没有返回值的函数")
}

        说明:当函数无返回值时,可以省略 Unit。

2.2 数字类型

2.2.1 整数类型

类型大小(位)最小值最大值案例
Byte8-128127

var a: Byte = 1

var a = 1

val a = 0b1001 // 二进制

val a = 0xAF // 十六进制

Short16-3276832767

var a: Short = 1

var a = 1

Int32

-2,147,483,648

(-2^31)

2,147,483,648(2^31-1)

var a: Int = 1

var a = 1

var a = 1_000_000

Long64-9,223,372,036,854,775,808(-2^63)

9,223,372,036,854,775,807

(2^63-1)

var a: Long = 1L

var a = 1L

UByte80255

var a: UByte = 1u

var a = 1u

UShort16065535

var a: UShort = 1u

var a = 1u

UInt320

4,294,967,295

(2^32-1)

var a: UInt = 1u

var a = 1u

ULong640

18,446,744,073,709,551,615

(2^64-1)

var a: ULong = 1uL

var a = 1uL

var a = 0xFFF_FFF_FFFuL 

        进制表示如下。

// 二进制
val a = 0b1001 // 0b是二进制前缀, 1001对应十进制的9// 十六进制
val a = 0xAF // 0x是十六进制前缀, AF对应十进制的31

        注意:Kotlin 没有八进制前缀表示。

2.2.2 浮点类型

类型大小(位)

符号位(S)/

阶码(E)/

尾数(M)

最小值/

最大值/

最小正数

有效位数案例
Float321S + 8E + 23M

-3.4028235E38

3.4028235E38

1.4E-45

6

var a: Float = 1.0F

var a = 1.0F

var a = 1.0f

Double641S + 11E + 52M

-1.7976931348623157E308

1.7976931348623157E308

4.9E-324

15

var a: Double = 1.0

var a = 1.0

        浮点数编码原理详见 → 浮点数编码原理。

2.2.3 运算符

运算符描述作用域优先级案例
+加法整数/浮点数

作为一元运算符时,优先级为1

作为二元运算符时,优先级为3

1 + 2 = 3

-减法整数/浮点数

作为一元运算符时,优先级为1

作为二元运算符时,优先级为3

1 - 2 = -1
*乘法整数/浮点数22 * 3 = 6
/整除/除法整数/浮点数2

3 / 2 = 1

3.0 / 2 = 1.5

3 / 2.0 = 1.5

%取余整数/浮点数27 % 3 = 1
++加1整数/浮点数1

a++(先使用, 后加1)

++a(先加1, 后使用)

--减1整数/浮点数1

a--(先使用, 后减1)

--a(先减1, 后使用)

=赋值所有类型9a = 1
+=

加赋值

整数/浮点数9a += 1 ⇔ a = a + 1
-=减赋值整数/浮点数9a -= 2 ⇔ a = a - 2
*=乘赋值整数/浮点数9a *= 3 ⇔ a = a * 3
/=除赋值整数/浮点数9a /= 4 ⇔ a = a / 4
%=取余赋值整数/浮点数9a %= 5⇔ a = a % 5
shl有符号左移Int/Long4

3 shl 1 = 6

-1 shl 1 = -2

-3 shl 1 = -6

shr有符号右移Int/Long4

3 shr 1 = 1

-1 shr 1 = -1

-3 shr 1 = -2

ushr无符号右移Int/Long4

3 ushr 1 = 1

-1 ushr 1 = 2147483647

-3 ushr 1 = 2147483646

and按位与Int/Long5

// 1001 and 0011 = 0001

9 and 3 = 1

or按位或Int/Long6

// 1001 or 0011 = 1011

9 or 3 = 11

xor按位异或Int/Long7

// 1001 xor 0011 = 1010

9 or 3 = 10

inv按位取反Int/Long1

9.inv() = -10

(-1).inv() = 0

(-3).inv() = 2

..闭区间整数8

1..4 // 1, 2, 3, 4

..<左开右闭区间整数81..<4 // 1, 2, 3
until左开右闭区间整数81 until 4 // 1, 2, 3

2.3 布尔类型

2.3.1 布尔类型

类型大小(位)取值案例
Boolean1true / false

var a: Boolean = true

var a = false

2.3.2 运算符

运算符描述作用域优先级案例
==等于整数/布尔/字符

1

1 == 2 // false

1 == 1 // true

!=不等于整数/布尔/字符

1

1 != 2 // true

1 != 1 // false

<小于整数/浮点数/字符11 < 2 // true
>大于整数/浮点数/字符1

1 > 2 // false

<=小于等于整数/字符11 <= 2 // true
>=大于等于整数/字符11 >= 2 // false
in在范围内整数/字符13 in 1..9 // true
!in不在范围内整数/字符13 !in 1..9 // false
!布尔2

!true // false

!false // true

&&布尔3true && false // false
||布尔4true || false // true

2.4 字符类型

2.4.1 字符类型

类型大小(位)案例
Char16

var a: Char = ‘A’

var a = 'A'

var a = '好'

var a = '\u725B' // 牛

var a = Char(66) // B

var a = 'A' + 4 // E

'A'.code // 65

2.4.2 转义字符

\t —— Tab制表符
\b —— 退格
\n —— 换行(LF)
\r —— 回车(CR)
\' —— 单引号
\" —— 双引号
\\ —— 反斜杠
\$ —— 美元符号

2.5 字符串类型

2.5.1 字符串的定义

var str1 : String = "abc"
var str2 = "abc"
var str3 = "abc" + "def" // "abcdef"
// 原始字符串
var str4  = """第一行第二行第三行"""
// 字符串模板
var count = 15
var str5 = "买了${count}个苹果" // 买了15个苹果

        通过下标即可访问字符串中元素,如下。

var str = "abc"
var c1 = str[0] // 'a'
var c2 = str.elementAt(1) // 'b'

2.5.2 字符串函数

        Kotlin 中 String 类继承 CharSequence 类,在 _String.kt、StringsJVM.kt、StringNumberConversionsJVM.kt 等文件中定义了一些 CharSequence、String 的扩展函数。

        1)判空

// length == 0
public inline fun CharSequence.isEmpty(): Boolean
// length > 0
public inline fun CharSequence.isNotEmpty(): Boolean
// this == null || this.length == 0
public inline fun CharSequence?.isNullOrEmpty(): Boolean
// length == 0 || indices.all { this[it].isWhitespace() }
public actual fun CharSequence.isBlank(): Boolean
// !isBlank()
public inline fun CharSequence.isNotBlank(): Boolean
// this == null || this.isBlank()
public inline fun CharSequence?.isNullOrBlank(): Boolean

        2)去掉首位空字符

public inline fun String.trim(): String

        3)查找字符

public expect fun CharSequence.elementAt(index: Int): Char
public inline fun CharSequence.find(predicate: (Char) -> Boolean): Char
public inline fun CharSequence.findLast(predicate: (Char) -> Boolean): Char
public fun CharSequence.first(): Char
public inline fun CharSequence.first(predicate: (Char) -> Boolean): Char
public fun CharSequence.last(): Char
public inline fun CharSequence.last(predicate: (Char) -> Boolean): Char
public inline fun CharSequence.random(): Char

        4)查找字符索引

public inline fun CharSequence.indexOfFirst(predicate: (Char) -> Boolean): Int
public inline fun CharSequence.indexOfLast(predicate: (Char) -> Boolean): Int

         5)过滤字符

public inline fun String.filter(predicate: (Char) -> Boolean): String
public inline fun String.filterIndexed(predicate: (index: Int, Char) -> Boolean): String
public inline fun String.filterNot(predicate: (Char) -> Boolean): String

        6)统计字符个数

// 返回length
public inline fun CharSequence.count(): Int
// 统计字符串中满足条件的字符个数
public inline fun CharSequence.count(predicate: (Char) -> Boolean): Int

         7)字符串匹配

// 判断字符串是否以xxx开头
public fun CharSequence.startsWith(char: Char, ignoreCase: Boolean = false): Boolean
public fun CharSequence.startsWith(prefix: CharSequence, ignoreCase: Boolean = false): Boolean
public fun CharSequence.startsWith(prefix: CharSequence, startIndex: Int, ignoreCase: Boolean = false): Boolean
// 判断字符串是否以xxx结尾
public fun CharSequence.endsWith(char: Char, ignoreCase: Boolean = false): Boolean
public fun CharSequence.endsWith(suffix: CharSequence, ignoreCase: Boolean = false): Boolean

        8)获取子串

public inline fun CharSequence.substring(startIndex: Int, endIndex: Int = length): String
public fun String.substring(range: IntRange): String
public fun String.slice(indices: IntRange): String
public fun String.take(n: Int): String
public fun String.takeLast(n: Int): String

        9)字符串分割

public fun CharSequence.split(vararg delimiters: Char, ignoreCase: Boolean = false, limit: Int = 0): List<String>
public fun CharSequence.split(vararg delimiters: String, ignoreCase: Boolean = false, limit: Int = 0): List<String>

        说明:字符串分割支持正则匹配,详见 → 正则表达式(Regular Expression)详解。 

        10)字串替换

// 替换所有匹配的字符或字符串
public actual fun String.replace(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String
public actual fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String
// 替换第一个匹配的字符或字符串
public actual fun String.replaceFirst(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String
public actual fun String.replaceFirst(oldValue: String, newValue: String, ignoreCase: Boolean = false): String
// 将第一个匹配的字符或字符串前面的字符串替换为指定字符或字符串
public fun String.replaceBefore(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
public fun String.replaceBefore(delimiter: String, replacement: String, missingDelimiterValue: String = this): String
// 将第一个匹配的字符或字符串后面的字符串替换为指定字符或字符串
public fun String.replaceAfter(delimiter: Char, replacement: String, missingDelimiterValue: String = this): String
public fun String.replaceAfter(delimiter: String, replacement: String, missingDelimiterValue: String = this): String
// 将指定索引范围的字符串替换为新字符串
public inline fun String.replaceRange(startIndex: Int, endIndex: Int, replacement: CharSequence): String
public inline fun String.replaceRange(range: IntRange, replacement: CharSequence): String

        说明:字符串替换支持正则匹配,详见 → 正则表达式(Regular Expression)详解。

         11)字符串反转

public inline fun String.reversed(): String

        12)大小写转换

// 转为大写字符串, locale可以传入Locale.ROOT
public inline fun String.uppercase(locale: Locale): String
// 转为小写字符串, locale可以传入Locale.ROOT
public inline fun String.lowercase(locale: Locale): String

        13)数据类型转换

public actual inline fun String.toInt(): Int
public actual inline fun String.toLong(): Long
public actual inline fun String.toFloat(): Float
public actual inline fun String.toDouble(): Double
public inline fun String.toBigInteger(): java.math.BigInteger
public inline fun String.toBigDecimal(): java.math.BigDecimal

相关文章:

【Kotlin】Kotlin基本数据类型

1 变量声明 var a : Int // 声明整数类型变量 var b : Int 1 // 声明整数类型变量, 同时赋初值为1 var c 1 // 声明整数类型变量, 同时赋初值为1 val d 1 // 声明整数类型常量, 值为1(后面不能改变d的值) 变量命名规范如下。 变量名可以由字母、数字、下划线&#xff08;_…...

UDP端口探活的那些细节

一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了&#xff0c;如图 udp是无连接的&#xff0c;无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符&#xff0c;并且配置期望返回的字符串&#xff0c; [[instances]] targets…...

拦截器配置,FeignClient根据业务规则实现微服务动态路由

文章目录 业务场景拦截器用法Open Feign介绍 业务场景 我们服务使用Spring Cloud微服务架构&#xff0c;使用Spring Cloud Gateway 作为网关&#xff0c;使用 Spring Cloud OpenFeign 作为服务间通信方式我们现在做的信控平台&#xff0c;主要功能之一就是对路口信号机进行管控…...

预测模型:MATLAB线性回归

1. 线性回归模型的基本原理 线性回归是统计学中用来预测连续变量之间关系的一种方法。它假设变量之间存在线性关系&#xff0c;可以通过一个或多个自变量&#xff08;预测变量&#xff09;来预测因变量&#xff08;响应变量&#xff09;的值。基本的线性回归模型可以表示为&…...

【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)

什么是嵌入&#xff1f; OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于&#xff1a; Search 搜索&#xff08;结果按与查询字符串的相关性排序&#xff09;Clustering 聚类&#xff08;文本字符串按相似性分组&#xff09;Recommendations 推荐&#xff08;推荐具有…...

Redis + Lua 实现分布式限流器

文章目录 Redis Lua 限流实现1. 导入依赖2. 配置application.properties3. 配置RedisTemplate实例4. 定义限流类型枚举类5. 自定义注解6. 切面代码实现7. 控制层实现8. 测试 相比 Redis事务&#xff0c; Lua脚本的优点&#xff1a; 减少网络开销&#xff1a;使用Lua脚本&…...

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…...

Habitat环境学习四:Habitat-sim基础用于导航——使用导航网格NavMesh

如何使用导航网格NavMesh 官方教程1、NavMesh基础定义1.1 使用NavMesh的原因1.2 什么是NavMesh 2、NavMesh的使用方法2.1 获取自上而下Top down view视角地图2.2 在NavMesh中进行查询以及随机产生可导航点2.3 查找最短路径2.4 场景加载NavMesh2.5 重新计算并生成NavMesh2.6 什么…...

python学习笔记 -- 字符串

目录 一、输出字符串的格式 二、字符串的一些函数 1、len函数&#xff1a;字符串长度 2、查找字符所在位置index 3、某字符在字符串中的个数count 4、字符切片 对字符串进行翻转 -- 利用步长 5、修改大小写字母&#xff1a; 6、判断开头和结尾 7、拆分字符串 一、输出…...

2024年GPT如何发展?

2023 年&#xff0c;人工智能领域最具影响的莫过于 GPT-4、ChatGPT 了。 ChatGPT 凭一己之力掀起了 AI 领域的热潮&#xff0c;火爆全球&#xff0c;似乎开启了第四次工业革命。 ChatGPT 入选《Nature》2023 年度十大人物&#xff08;Nature’s 10&#xff09;&#xff0c;这…...

从REPR设计模式看 .NET的新生代类库FastEndpoints的威力

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 又到了一年年末,春节将至…...

前端入门:(五)JavaScript 续

10. 浏览器存储 10.1 Cookie的概念和使用 Cookie是一种存储在用户计算机上的小型文本文件&#xff0c;用于跟踪和识别用户。Cookie通常用于存储用户的偏好设置、会话信息等&#xff0c;可以通过JavaScript进行读取和设置。 // 示例&#xff1a;设置和读取Cookie document.co…...

研究多态恶意软件,探讨网络安全与AI

前言 近期ChatGPT火遍全球&#xff0c;AI技术被应用到了全球各行各业当中&#xff0c;国内外各大厂商也开始推出自己的ChatGPT&#xff0c;笔者所在公司在前段时间也推出了自研的安全GPT&#xff0c;AI技术在网络安全行业得到了很多的应用&#xff0c;不管是网络安全研究人员、…...

linux驱动工作原理

linux或者windows驱动是如何对上和对下工作的&#xff0c;请用中文回答 在Linux系统中&#xff0c;设备驱动程序通过在/dev目录下创建文件系统条目与硬件通信。应用程序通过打开这些文件来获取描述符&#xff0c;以此来与设备交互。驱动程序内部使用主次设备号来标识设备。而在…...

Rust语言入门(第3篇)

引用与借用 上一篇中&#xff0c;我们介绍了rust的所有权概念&#xff0c;若直接传递变量做函数参数&#xff0c;堆上的变量就会失去所有权&#xff0c;而栈上变量则由于复制&#xff0c;仍有所有权。 fn main(){let b 3;makes_copy(b);println!("after using a variab…...

电脑服务器离线安装.net framework 3.5解决方案(错误:0x8024402c )(如何确定当前系统是否安装NET Framework 3.5)

问题环境&#xff1a; 日常服务的搭建或多或少都会有需要到NET Framework 3.5的微软程序运行框架&#xff0c;本次介绍几种不同的安装方式主要解决运行在Windows 2012 以上的操作系统的服务。 NET Framework 3.5 是什么&#xff1f; .NET Framework是微软公司推出的程序运行框架…...

Three.js学习8:基础贴图

一、贴图 贴图&#xff08;Texture Mapping&#xff09;&#xff0c;也翻译为纹理映射&#xff0c;“贴图”这个翻译更直观。 贴图&#xff0c;就是把图片贴在 3D 物体材质的表面&#xff0c;让它具有一定的纹理&#xff0c;来为 3D 物体添加细节的一种方法。这使我们能够添加…...

【Linux】进程学习(二):进程状态

目录 1.进程状态1.1 阻塞1.2 挂起 2. 进程状态2.1 运行状态-R进一步理解运行状态 2.2 睡眠状态-S2.3 休眠状态-D2.4 暂停状态-T2.5 僵尸状态-Z僵尸进程的危害 2.6 死亡状态-X2.7 孤儿进程 1.进程状态 1.1 阻塞 阻塞&#xff1a;进程因为等待某种条件就绪&#xff0c;而导致的…...

Spring Boot 笔记 003 Bean注册

使用Idea导入第三方jar包 在porn.xml种添加的第三方jar包依赖&#xff0c;并刷新 可以在启动类中尝试调用 以上放到启动类中&#xff0c;不推荐&#xff0c;建议创建一个专门定义的类 package com.geji.config;import cn.itcast.pojo.Country; import cn.itcast.pojo.Province;…...

PCIE 参考时钟架构

一、PCIe架构组件 首先先看下PCIE架构组件&#xff0c;下图中主要包括&#xff1a; ROOT COMPLEX (RC) (CPU); PCIE PCI/PCI-X Bridge; PCIE SWITCH; PCIE ENDPOINT (EP) (pcie设备); BUFFER; 各个器件的时钟来源都是由100MHz经过Buffer后提供。一个PCIE树上最多可以有256…...

【开源】JAVA+Vue.js实现在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…...

计算机网络(第六版)复习提纲29

第六章&#xff1a;应用层 SS6.1 域名系统DNS 1 DNS被设计为一个联机分布式数据库系统&#xff0c;并采用客户服务器方式&#xff08;C/S&#xff09; 2 域名的体系结构 3 域名服务器及其体系结构 A 域名服务器的分类 1 根域名服务器 2 顶级域名服务器&#xff08;TLD服务器&a…...

有道ai写作,突破免费限制,无限制使用

预览效果 文末提供源码包及apk下载地址 有道ai写作python版 import hashlib import time import json import ssl import base64 import uuidfrom urllib.parse import quote import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from Crypto…...

node.js 使用 elementtree 生成思维导图 Freemind 文件

请参阅: java : pdfbox 读取 PDF文件内书签 请注意&#xff1a;书的目录.txt 编码&#xff1a;UTF-8&#xff0c;推荐用 Notepad 转换编码。 npm install elementtree --save 编写 txt_etree_mm.js 如下 // 读目录.txt文件&#xff0c;使用 elementtree 生成思维导图 Free…...

Vue中路由守卫的详细应用

作为一名web前端开发者&#xff0c;我们肯定经常使用Vue框架来构建我们的项目。而在Vue中&#xff0c;路由是非常重要的一部分&#xff0c;它能够实现页面的跳转和导航&#xff0c;提供更好的用户体验。然而&#xff0c;有时我们需要在路由跳转前或跳转后执行一些特定的逻辑&am…...

Flink Checkpoint过程

Checkpoint 使用了 Chandy-Lamport 算法 流程 1. 正常流式处理&#xff08;尚未Checkpoint&#xff09; 如下图&#xff0c;Topic 有两个分区&#xff0c;并行度也为 2&#xff0c;根据奇偶数 我们假设任务从 Kafka 的某个 Topic 中读取数据&#xff0c;该Topic 有 2 个 Pa…...

【Java程序代理与系统代理关系】Java程序代理与系统代理关系优先级及覆盖关系

前言 使用Apache HttpClient工具包中的HttpClients.createDefault()方法创建的默认HTTP客户端会根据操作系统当前的设置来决定是否使用代理。 具体来说&#xff0c;当创建默认HTTP客户端时&#xff0c;它会检查系统的代理设置。如果操作系统当前设置了系统级代理&#xff0c;…...

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势&#xff1a; 服务解耦 性能提升&#xff0c;吞吐量提高 服务没有强依赖&#xff0c;不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高&#xff0c;所有大多数时间用同步。而如果不需要对方的结果&#xff0c;且吞吐…...

Vue 3 + Koa2 + MySQL 开发和上线部署个人网站

Vue 3 Koa2 MySQL 开发和上线部署个人网站 记录个人的一个操作步骤, 顺序不分先后, 嫌啰嗦请出门右转! 环境说明: 服务器: 阿里云轻量应用服务器 服务器系统: CentOS8.2 本地环境: macOS 12.7.2 Node: 20.10.0 MySQL: 8.0.26 Vue: 3.3.11 Koa: 2.7.0 pm2: 5.3.1 Nginx: 1.1…...

uniapp踩坑之项目:简易版不同角色显示不一样的tabbar和页面

1. pages下创建三个不同用户身份的“我的”页面。 显示第几个tabbar&#xff0c;0是管理员 1是财务 2是司机 2. 在uni_modules文件夹创建底部导航cc-myTabbar文件夹&#xff0c;在cc-myTabbar文件夹创建components文件夹&#xff0c;在components文件夹创建cc-myTabbar.vue组件…...