scala_异常处理、提取器、泛型

IEC61850 通信协议测试验证实战指南:从理论到实践 本文提供了一份全面的IEC61850通信协议测试验证实战指南,强调测试必须从理论走向工程实践。文章详细讲解了如何搭建测试环境,并深入剖析了MMS、GOOSE、SV三大核心协议的实战测试方法,旨在帮助工程师通过系统化的测试验证,确保电力自动化设备的互操作性与通信可靠性。 阅读详情

异常处理

来看看下面一段代码。

  def main(args: Array[String]): Unit = {
   val i = 10 / 0
    
    println("你好!")
  }

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at ForDemo$.main(ForDemo.scala:3)
	at ForDemo.main(ForDemo.scala)

执行程序,可以看到scala抛出了异常,而且没有打印出来"你好"。说明程序出现错误后就终止了。

那怎么解决该问题呢?

在scala中,可以使用异常处理来解决这个问题



捕获异常

语法格式

try {
    // 代码
}
catch {
    case ex:异常类型1 => // 代码
    case ex:异常类型2 => // 代码
}
finally {
    // 代码
}
  • try中的代码是我们编写的业务处理代码
  • 在catch中表示当出现某个异常时,需要执行的代码
  • 在finally中,是不管是否出现异常都会执行的代码


示例

示例说明

  • 使用try…catch来捕获除零异常

参考代码

try {
    val i = 10 / 0

    println("你好!")
} catch {
    case ex: Exception => println(ex.getMessage)
} 


抛出异常

我们也可以在一个方法中,抛出异常。语法格式和Java类似,使用throw new Exception...



示例 | 抛出异常

示例说明

  • 在main方法中抛出一个异常

参考代码

  def main(args: Array[String]): Unit = {
    throw new Exception("这是一个异常")
  }

Exception in thread "main" java.lang.Exception: 这是一个异常
	at ForDemo$.main(ForDemo.scala:3)
	at ForDemo.main(ForDemo.scala)


  • scala不需要在方法上声明要抛出的异常,它已经解决了再Java中被认为是设计失败的检查型异常。

下面是Java代码

public static void main(String[] args) throws Exception {
    throw new Exception("这是一个异常");
}


提取器(Extractor)

我们之前已经使用过scala中非常强大的模式匹配功能了,通过模式匹配,我们可以快速匹配样例类中的成员变量。例如:

// 1. 创建两个样例类
case class Person(name:String, age:Int)
case class Order(id:String)

def main(args: Array[String]): Unit = {
    // 2. 创建样例类对象,并赋值为Any类型
    val zhangsan:Any = Person("张三", 20)
    val order1:Any = Order("001")

    // 3. 使用match...case表达式来进行模式匹配
    // 获取样例类中成员变量
    order1 match {
        case Person(name, age) => println(s"姓名:${name} 年龄:${age}")
        case Order(id1) => println(s"ID为:${id1}")
        case _ => println("未匹配")
    }
}

那是不是所有的类都可以进行这样的模式匹配呢?答案是:

不可以的。要支持模式匹配,必须要实现一个提取器。

[!NOTE]

样例类自动实现了apply、unapply方法



定义提取器

之前我们学习过了,实现一个类的伴生对象中的apply方法,可以用类名来快速构建一个对象。伴生对象中,还有一个unapply方法。与apply相反,unapply是将该类的对象,拆解为一个个的元素。

在这里插入图片描述

在这里插入图片描述

要实现一个类的提取器,只需要在该类的伴生对象中实现一个unapply方法即可。


语法格式

def unapply(stu:Student):Option[(类型1, 类型2, 类型3...)] = {
    if(stu != null) {
        Some((变量1, 变量2, 变量3...))
    }
    else {
        None
    }
}


示例

示例说明

  • 创建一个Student类,包含姓名年龄两个字段
  • 实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。

参考代码

class Student(var name:String, var age:Int)

object Student {
    def apply(name:String, age:Int) = {
        new Student(name, age)
    }

    def unapply(student:Student) = {
        val tuple = (student.name, student.age)

        Some(tuple)
    }
}

def main(args: Array[String]): Unit = {
    val zhangsan = Student("张三", 20)

    zhangsan match {
        case Student(name, age) => println(s"${name} => ${age}")
    }
}

泛型

scala和Java一样,类和特质、方法都可以支持泛型。我们在学习集合的时候,一般都会涉及到泛型。

scala> val list1:List[String] = List("1", "2", "3")
list1: List[String] = List(1, 2, 3)

那如何自己定义泛型呢?



定义一个泛型方法

在scala中,使用方括号来定义类型参数。

语法格式

def 方法名[泛型名称](..) = {
    //...
}


示例

示例说明

  • 用一个方法来获取任意类型数组的中间的元素
    • 不考虑泛型直接实现(基于Array[Int]实现)
    • 加入泛型支持

参考代码

不考虑泛型的实现

  def getMiddle(arr:Array[Int]) = arr(arr.length / 2)

  def main(args: Array[String]): Unit = {
    val arr1 = Array(1,2,3,4,5)

    println(getMiddle(arr1))
  }

加入泛型支持

def getMiddleElement[T](array:Array[T]) =
array(array.length / 2)

def main(args: Array[String]): Unit = {
    println(getMiddleElement(Array(1, 2, 3, 4, 5)))
    println(getMiddleElement(Array("a", "b", "c", "d", "e")))
}


泛型类

scala的类也可以定义泛型。接下来,我们来学习如何定义scala的泛型类

定义

语法格式

class 类[T](val 变量名: T)
  • 定义一个泛型类,直接在类名后面加上方括号,指定要使用的泛型参数
  • 指定类对应的泛型参数后,就使用这些类型参数来定义变量了


示例

示例说明

  • 实现一个Pair泛型类
  • Pair类包含两个字段,而且两个字段的类型不固定
  • 创建不同类型泛型类对象,并打印

参考代码

case class Pair[T](var a:T, var b:T)

def main(args: Array[String]): Unit = {
    val pairList = List(
        Pair("Hadoop", "Storm"),
        Pair("Hadoop", 2008),
        Pair(1.0, 2.0),
        Pair("Hadoop", Some(1.9))
    )

    println(pairList)
}


上下界

需求:

我们在定义方法/类的泛型时,限定必须从哪个类继承、或者必须是哪个类的父类。此时,就需要使用到上下界。



上界定义

使用<: 类型名表示给类型添加一个上界,表示泛型参数必须要从该类(或本身)继承

语法格式

[T <: 类型]


示例

示例说明

  • 定义一个Person类
  • 定义一个Student类,继承Person类
  • 定义一个demo泛型方法,该方法接收一个Array参数,
  • 限定demo方法的Array元素类型只能是Person或者Person的子类
  • 测试调用demo,传入不同元素类型的Array

参考代码

class Person
class Student extends Person

def demo[T <: Person](a:Array[T]) = println(a)

def main(args: Array[String]): Unit = {
    demo(Array(new Person))
    demo(Array(new Student))
    // 编译出错,必须是Person的子类
    // demo(Array("hadoop"))
}


下界

上界是要求必须是某个类的子类,或者必须从某个类继承,而下界是必须是某个类的父类(或本身)

语法格式

[T >: 类型]

[!NOTE]

如果类既有上界、又有下界。下界写在前面,上界写在后面



示例

示例说明

  • 定义一个Person类
  • 定义一个Policeman类,继承Person类
  • 定义一个Superman类,继承Policeman类
  • 定义一个demo泛型方法,该方法接收一个Array参数,
  • 限定demo方法的Array元素类型只能是Person、Policeman
  • 测试调用demo,传入不同元素类型的Array

参考代码

class Person
class Policeman extends Person
class Superman extends Policeman

def demo[T >: Policeman](array:Array[T]) = println(array)

def main(args: Array[String]): Unit = {
    demo(Array(new Person))
    demo(Array(new Policeman))
    // 编译出错:Superman是Policeman的子类
    // demo(Array(new Superman))
}

注意:在有多个泛型,比如A,B,…时,泛型的下界会失效


协变、逆变、非变

spark的源代码中大量使用到了协变、逆变、非变,学习该知识点对我们将来阅读spark源代码很有帮助。


来看一个类型转换的问题:

class Pair[T]

object Pair {
  def main(args: Array[String]): Unit = {
    val p1 = Pair("hello")
    // 编译报错,无法将p1转换为p2
    val p2:Pair[AnyRef] = p1

    println(p2)
  }
}

如何让带有泛型的类支持类型转换呢?



非变

语法格式

class Pair[T]{}
  • 默认泛型类是非变的
  • 类型B是A的子类型,Pair[A]和Pair[B]没有任何从属关系
  • Java是一样的

在这里插入图片描述



协变

语法格式

class Pair[+T]
  • 类型B是A的子类型,Pair[B]可以认为是Pair[A]的子类型
  • 参数化类型的方向和类型的方向是一致的。


逆变

语法格式

class Pair[-T]
  • 类型B是A的子类型,Pair[A]反过来可以认为是Pair[B]的子类型
  • 参数化类型的方向和类型的方向是相反的


示例

示例说明

  • 定义一个Super类、以及一个Sub类继承自Super类
  • 使用协变、逆变、非变分别定义三个泛型类
  • 分别创建泛型类来演示协变、逆变、非变

参考代码

class Super
class Sub extends Super

class Temp1[T]
class Temp2[+T]
class Temp3[-T]

def main(args: Array[String]): Unit = {
    val a:Temp1[Sub] = new Temp1[Sub]
    // 编译报错
    // 非变
    //val b:Temp1[Super] = a

    // 协变
    val c: Temp2[Sub] = new Temp2[Sub]
    val d: Temp2[Super] = c

    // 逆变
    val e: Temp3[Super] = new Temp3[Super]
    val f: Temp3[Sub] = e
}


汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC配置 本文详细解析了汇川伺服与西门子PLC通过Modbus-RTU协议进行通讯的实战步骤,包括帧结构解析、硬件连接、参数设置及PLC程序配置。通过具体案例和常见问题排查指南,帮助工程师快速掌握工业自动化中的通讯技术,提升设备调试效率。 阅读详情

相关推荐

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 332

scala代码学习构建计算器,第2 部分(代码学习第九天)

回忆一下我们的英雄所处的困境:在试图创建一个 DSL(这里只不过是一种非常简单的计算器语言)时,他创建了包含可用于该语言的各种选项的树结构: •二进制加/减/乘/除运算符 •一元反运算符 •数值 它背后的执行引擎知道如何执行那些操作,它甚至有一个显式的优化步骤,以减少获得结果所需的计算。 最后的 代码 是这样的: 清单 1. 计算器 DSL:AST 和解释器 ...

lw7877187的博客 395

高性能网站设计之缓存更新的套路

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。 我不知道为什么这么多人用的都是这

代码技巧 1万+

【scala】 scala 条件控制 和异常处理(二)

1.scala 变量定义 ,var val 区别。 var 定义可变变量 val 定义不可变变量,scala 推荐使用。相当于Java的final 变量. scala中包含的基本数据类型详情如下表所示: 序号基本类型增强类型大小取值范围 1 Byte RichByte 8-bit -128 ~ 127 2 Char Rich...

a84480766的博客 223

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 663

运放电路实战:5分钟搞定加法器与减法器的电路设计与调试(附避坑指南)

本文从实战角度出发,详细讲解了运算放大器加法器与减法器的电路设计与调试方法。针对加法器,重点分析了利用“虚地”特性简化设计和选型要点;对于减法器,则深入剖析了决定精度的核心——电阻匹配问题,并提供了使用电阻网络等提升共模抑制比的实用策略。文章还分享了从仿真到实物焊接的完整流程与常见避坑技巧,帮助电子爱好者快速掌握这两种基础运放电路。

weixin_28323057的博客 464

scala part5 黑马,高阶函数,隐式转换,泛型

option类型(用来避免空指针的遇到一次处理一次的繁琐操作) def divide(a:Int,b:Int):Option[int] = { if(b == 0) None else Some(a/b) } result1 = divide(10,0) result1 match{ case Some(x) => println() case None => println() } 偏函数(是一个PartialFunction类的对象)

qq_40473204的博客 217

MATLAB 论文复现——基于虚拟储能的电动汽车充放电调度策略及激励评价

文章基于虚拟储能聚合体仿真模型优化电动汽车充放电调度,并采用复合权重评价电动汽车的充电激励。根据电动汽车灵活性和系统稳定性衡量其贡献大小,并通过模糊推理系统模拟用户的充电意愿,实现对电动汽车充电的引导和优化。[1]陈朔,胡昊,方慧敏,等.基于虚拟储能的电动汽车充放电调度策略及激励评价[J/OL].系统仿真学报,1-12[2024-07-24].https://doi.org/10.16182/j.issn1004731x.joss.23-1316.基于虚拟储能的电动汽车充放电调度策略及激励评价。

sjr1478的博客 363

scala基础之泛型详解

在Scala中你可以使用类型参数来实现类和函数,这样的类和函数可以用于多种类型。比如Array[T] 你可以存放任意指定类型T的数据. 类、特质、函数都可以有类型参数;将类型参数放在名字后面用方括号括起来   一 泛型类 1.1Java 实现 public class AnimalsA,B> {     private A name;     private B age;

happy19870612's blog 1万+

三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)

三维旋转引言三维旋转1)欧拉角2)轴角式旋转分解1)V||的旋转2)V⊥的旋转3)V的整体旋转 引言 前面我们了解了 复数在二维旋转中的作用与联系 而四元数与三维旋转之间的关系与复数对二维旋转有很多类似的地方,下面我们就先来详细了解一下三维旋转的过程。 三维旋转 首先讨论一下三维旋转,我们了解到常用的三维旋转有两种方式: 1)欧拉角 即按照一定的顺序,分别对X, Y, Z三个轴进行旋转 θ 角。绕各旋转轴的旋转矩阵为: 然后任意的三维旋转可以分解成上述三种旋转方式的组合。(注意:三个旋转的顺序是非常重要的

晓晨的博客 1万+

Linux LT8912b调试记录(MIPI转LVDS/HDMI)

本文记录了在RK3588平台上使用LT8912B芯片实现MIPI转LVDS/HDMI的调试过程。主要包含设备树配置、驱动代码实现及常见问题解决。调试重点包括:1)正确配置1280x800分辨率的LVDS屏幕参数;2)确保I2C总线正常通信;3)解决花屏、图像抖动、黑屏等问题,涉及lane-rate计算、同步信号极性调整及MIPI模式选择。文中提供了详细的寄存器配置代码和故障排查方法,特别强调了I2C通信验证和电压匹配的重要性。通过参数优化和多种模式测试,最终实现了稳定的视频输出转换。

qq_45147279的博客 1086

Scala>scala异常处理

异常处理 来看看下面一段代码。 def main(args: Array[String]): Unit = { val i = 10 / 0 println("你好!") } Exception in thread "main" java.lang.ArithmeticException: / by zero at ForDemo$.main(ForDemo.s...

qq_44509920的博客 638

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1963

scala快速入门--Option类型、偏函数、正则表达式、异常处理、提取器、泛型的使用方法

scala快速入门–Option类型、偏函数、正则表达式、异常处理、提取器的使用方法 文章目录scala快速入门--Option类型、偏函数、正则表达式、异常处理、提取器的使用方法1、Option类型2、偏函数3、正则表达式4、异常处理4.1、捕获异常4.2、抛出异常5、提取器(Extractor)5.1、定义提取器6、泛型6.1、定义一个泛型方法6.2、泛型类6.3、泛型的上下界6.3.1、上...

Mr_Yang888的博客 517

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大数据基础-scala样例类,模式匹配,Option类型,偏函数,正则,异常处理,提取器,泛型,Actor并发变成,WordCount案例

啊啊啊

weixin_45154559的博客 489

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Scala笔记(三)模式匹配、异常处理与泛型

文章目录一、模式匹配简单模式匹配匹配类型守卫匹配样例类提取器匹配集合匹配数组匹配列表匹配元组变量声明中的模式匹配获取数组中的元素获取List中的元素正则表达式二、异常处理捕获异常抛出异常三、泛型泛型方法泛型类上下界上界下界协变、逆变、非变非变协变逆变 一、模式匹配 Scala 中有一个非常强大的模式匹配机制,可以应用在很多场景: switch 语句 类型查询 使用模式匹配快速获取数据 简单模式匹配 // 语法:match表达式 // 变量 match { // case "常量1" => 表达式

Suet_Nay的博客 319

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Scala程序设计基础(四)

异常处理 类似Java,使用try..catch捕获处理异常 不同的是catch中使用模式匹配的思想 try { // 代码 } catch { case ex:异常类型1 => // 代码 case ex:异常类型2 => // 代码 } finally { // 不管是否出现异常都会执行 // 代码 } 同样,可以使用th...

Roy的博客 437

Scala高级用法

目录1 样例类1.1 定义样例类1.2 样例类方法1.3 样例对象2 模式匹配2.1 简单匹配2.2 守卫2.3 匹配类型2.4 匹配集合2.5 变量声明中的模式匹配2.6 匹配样例类3 Option类型4 偏函数5 正则表达式6 异常处理6.1 捕获异常6.2 抛出异常7 提取器(Extractor)7.1 定义提取器8 泛型8.1 定义一个泛型方法8.2 定义一个泛型类8.3 上下界8.4 协变、逆变、非变9 Actor介绍9.1 Java并发编程的问题9.2 Actor并发编程模型9.3 Java并发

赵广陆 800

Scala:样例类、模式匹配、Option、偏函数、泛型(三)

Scala:样例类、模式匹配、Option、偏函数、泛型 课程目标 掌握样例类的使用 掌握模式匹配的使用 1. 样例类 样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类),在后续要学习并发编程和spark、flink这些框架也都会经常使用它。 1.1 定义样例类 语法格式 case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3) 如果要实现某个成员变量可以被修改,可以添加var 默认为val,可以

Maynor的博客 761

Scala

val user = User("zhangsan",11),该语句在执行时,实际调用的是 User 伴生对象中的apply 方法,因此不用 new 关键字就能构造出相应的对象。当将 User("zhangsan", 11)写在 case 后时[case User("zhangsan", 11) => "yes"],会默认调用 unapply 方法(对象提取器),user 作为 unapply 方法的参数,unapply 方法将 user 对象的 name 和 age 属性提取出来,与User("zhang

2501_90677980的博客 605

大数据-scala(十二)

大数据-scala(十二) 异常处理 捕获异常 在Scala里,借用了模式匹配的思想来做异常的匹配,以下为scala中try...catch异常处理的语法格式: try { // 代码 } catch { case ex:异常类型1 => // 代码 case ex:异常类型2 => // 代码 } finally { // 代码 } 示例: try { val...

海恋北斗星 204

Scala学习笔记(三)

Scala学习笔记(三)一、模式匹配1. 简单模式匹配2. 匹配类型3. 守卫4. 匹配样例类5. 匹配数组6. 匹配列表7. 匹配元组8. 变量声明中的模式匹配8.1 获取数组中的元素8.2 获取List中的数据二、样例类1. 定义样例类2. 定义一个样例类3. 可变成员变量4. 样例类的方法4.1 apply方法4.2 toString方法4.3 equals方法4.4 hashCode方法4...

AidenBrett7的博客 860

scala语言基础

1. scala简介 scala是运行在 JVM 上的多范式编程语言,同时支持面向对象和面向函数编程 早期scala刚出现的时候,并没有怎么引起重视,随着Spark和Kafka这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘。scala的主要优势是它的表达性。 官网地址 http://www.scala-lang.org 2. 为什么要使用scala 开发大数...

TU_JCN的博客 447

scala异常处理、提取器(Extractor)、文件IO

一、Scala 异常处理 Scala 的异常处理类似与其他语言 Scala 的方法可以通过抛出异常的方法的方式来终止相关代码的运行,不必通过返回值。 抛出异常 scala使用throw方法抛出异常,eg:抛出一个新的参数异常---&gt;throw new IllegalArgumentException 捕获异常 异常捕捉机制:若有异常发生,catch字句是按次序捕捉的。因此,在catc...

Candriy的博客 807

scala快速入门系列【异常处理】

        本篇作为scala快速入门系列的第三十三篇博客,为大家带来的是关于异常处理的内容。 文章目录捕获异常抛出异常示例 | 抛出异常         先让我们来看看一段代码     &...

大数据梦想家 2229

Scala基础语法小结(五)

1.异常处理 1.1 捕获异常 1.2 抛出异常 2.提取器 3.泛型 3.1 定义一个泛型方法 3.2 泛型类 3.3 上下界 3.3.1 上界 3.3.2 下界 3.4 协变、逆变、非变 3.4.1 协变 3.4.2 逆变 3.4.3 非变 ...

qq_42786792的博客 221
上一篇: scala_Option、偏函数、正则表达式
下一篇: scala_Actor并发编程
Imflash
博客等级 码龄8年 66粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值