《scala 编程(第3版)》学习笔记2

【图文详细 】Scala编程语言——什么是Scala 总结: 我对自己的要求是终身学习和每天保持迅速的进步,小老弟如果觉得看着还可以,我也不要你的赞和双击666,欢迎来看我定时更新的博客Scala汇总,并定时向您汇报最新的Scala内容:https://blog.youkuaiyun.com/qq_42246689/article/details/85073380 1、Scala 概述  1.1、什么是 Scala  Scala 官网:https://ww... 阅读详情
第7章 内建的控制结构
  1. Scal所有控制结构都会返回某种值。P114
  2. if语句:
if(布尔表达式 1){
   // 如果布尔表达式 1 为 true 则执行该语句块
}else if(布尔表达式 2){
   // 如果布尔表达式 2 为 true 则执行该语句块
}else {
   // 如果以上条件都为 false 执行该语句块
}
  1. if子句中的返回值类型必须一致或为继承关系(最终返回父类类型)。P215
  2. while语句,返回单元值Unit,写做()P117:
//while
while(condition)
{
   statement(s);
}
//do...while
do {
   statement(s);
} while( condition );
  1. 赋值语句也返回单元值。如a='1'返回(),单元值和所有值用==比较都返回true。P118
var a=1
() == (a=3)
<console>:13: warning: comparing values of types Unit and Unit using `==' will always yield true
       () == (a=3)
          ^
res4: Boolean = true
//try表达式能返回子句值
val k=try{val c=1 }
k: Unit = ()

  1. for语句知识点。
    • 生成器:i<- 集合 叫生成器P120
    • 过滤器:可包含多个过滤器,过滤器由 if condition(i)组成。P121
    • 多个生成器一起使用,可得到嵌套循环。P122
    • 中途变量,使用和val一样。P123
    • 可用{}代替(),实现自动;推断,不然()要手工用;来断句。P122
    • if过滤器前的;可省略(很奇怪)。如 for(a<- arr if a>1)。
    • yield产生新的集合,元素类型由yield后的代码体自有确定。for 子句 yield 代码体。P124
    • 完整子句包含生成器;定义(中途变量);过滤器。用{}可不写分号。P483
for{
a<- arr1 
m1=a+10
if a>1
b<- arr2 
m2=b+10
if b<2 
} yield {
(a,m1,b,m2)
}
//用括号
for(
a<- arr1; m1=a+10; if a>1;
b<- arr2; m2=b+10; if b<2 ;
) yield {
(a,m1,b,m2)
}
//推荐-用大括号-自动加分号功能只能在最后加
for{
a<- arr1; m1=a+10; if a>1
b<- arr2; m2=b+10; if b<2
} yield {
(a,m1,b,m2)
}
  1. 异常捕获:
    • scala异常清单
    • throw 表达式会返回Nothing。P126
    • try-catch返回值:无异常,返回try子句结果;有异常且被捕获,返回catch子句结果;有异常没被捕获,则无结果,因为异常向上扩散,该处无法继续执行下去。P128
    • 正常情况finally返回的值会被丢弃,除非显示的在finnally里写了return。则会覆盖try-catch的返回值。P129
    • 捕获所有异常
      try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException =>{
            println("Missing file exception")
         }
         case ex: Execpion=> {
            println("通常这个Exception就能捕获几乎所有异常了")
         }
      } finally {
      println("做些副作用操作,如清理数据,关闭文件等")
      //通常不要return value
      }
"""
Exception is programmatically recoverable. Its subclass RuntimeException indicates a programming error and is usually not to be caught as well. Throwable is super class of Exception as well as Error. In normal cases we should always catch sub-classes of Exception, so that the root cause doesn't get lost.

如果下面的写法捕获不到异常,可以使用case e:Throwable尝试捕获所有异常

catch {
  case e:Exception => { 
    e.printStackTrace()
  }
}
 

Thowable catches really everything even ThreadDeath which gets thrown by default to stop a thread from the now deprecated Thread.stop() method. So by catching Throwable you can be sure that you'll never leave the try block without at least going through your catch block, but you should be prepared to also handle OutOfMemoryError and InternalError or StackOverflowError.

Catching Throwable is most useful for outer server loops that delegate all sorts of requests to outside code but may itself never terminate to keep the service alive.
"""
  1. match表达式:
    • break隐含。P130
    • 返回匹配值后面的子句值。P130
    • 通配符(_)用于表示任意值。P130
    • 如果各子句值类型不一样,返回的是各子句值的父类型(很可能是Any)
    • 多个条件在一个case中,可用|分开
it match{
	case "a" => dosometing1()
	case "b" => dosometing2()
	case 123 | "str1" => "ok"
	case _ => dosometing3()
	}
  1. 一定要用break时,也可break foreach函数。
// 导入以下包
import scala.util.control._

// 创建 Breaks 对象
val loop = new Breaks;

// 在 breakable 中循环
loop.breakable{
    // 循环
    for(...){
       ....
       // 循环中断
       loop.break;
   }
	arr.foreach{
	 loop.break;
	}
}
  1. 花括号会引入一个新的作用域。P136
  2. 没有副作用的函数,更容易进行单元测试。P138
第8章 函数与闭包
  1. 对象内的函数叫方法。P140
  2. 函数式编程设计原则是尽量将程序分解成多个小函数,每个小函数完成特定功能。我们称这些小函数为助手函数。P142
  3. 助手函数会污染命名空间。解决方法1是用私有函数。方法2是用局部函数。P143
def func1(a,..)={
	def local_func1(b,..)={a}
}

  1. private修饰符只用在类成员上,局部函数前不需要。P143
  2. 局部函数可直接访问父函数的参数。P144
  3. 函数字面量在运行时,被实例化成函数值。函数字面量支持多条语句,用{}即可。P144
(x:Int)=>{
...
}
  1. 函数字面量在实例化时,会实例化成FunctionN特质的类。N表示参数个数。P144
  2. 下划线"_"占位符,在函数字面量中可用来表示多个参数。只有当参数在函数字面量中仅出现一次时才能使用。第一个下划线表示第一个参数,第二个表示第二个参数,依此类推。当无法自动推断类型时,需手动标注类型。P148
a.filter(x=>x>0) 
a.filter(_>0) //等价于
val f = (_:Int)+(_:Int)
  1. 部分应用函数:
    • Scala中的偏函数(patial function)与部分应用函数(partial applied function)是不同的概念,偏函数(patial function)在模式匹配一章有介绍,简而言之,偏函数是在某些值没有定义的函数;部分应用函数是一个函数有N个参数,我们固定某些参数(或不固定而是替换整个参数列表),提供小于N个参数的函数。
    • 部分应用函数是一个表达式,这个表达式中部给出函数需要的所有参数,只给出部分或完全不给。部分应用函数返回的是一个函数,如sum _ 或sum(1,_: Int,2)
    • “_”也可替换整个参数列表。P149
    • 注意理解,为何a.foreach(println)可这么精简。博主认为不用从部分应用函数角度理解,因为在需要函数作为参数的地方,就可以直接填一个函数。P151
scala> def sum= (_:Int) + (_:Int) + (_:Int)
sum: (Int, Int, Int) => Int

scala> def sum1(a:Int,b:Int,c:Int)=a+b+c
sum1: (a: Int, b: Int, c: Int)Int

//注意,定义函数时,不要用部分应用函数,不然相当于包一层sum()
scala> val sum2= (_:Int) + (_:Int) + (_:Int)
sum: (Int, Int, Int) => Int = <function3>


scala> val a =sum _
a: () => (Int, Int, Int) => Int = <function0>

//注意这个差异
scala> val a1=sum1  _
a1: (Int, Int, Int) => Int = <function3>

scala> a(1,2,3)
<console>:14: error: too many arguments for method apply: ()(Int, Int, Int) => Int in trait Function0
       a(1,2,3)
        ^

scala> a()(1,2,3)
res4: Int = 6

scala> a1(1,2,3)
res5: Int = 6


//以下,sum和sum1表现一致
scala> val b= sum(1,_:Int,3)
b: Int => Int = <function1>

scala> b(2)
res3: Int = 6

scala> val c=sum(1,_)
                  ^
<console>:12: error: not enough arguments for method apply: (v1: Int, v2: Int, v3: Int)Int in trait Function3.
Unspecified value parameter v3.
       val c=sum(1,_)
                ^

scala> val c=sum(1,_:Int,_:Int)
c: (Int, Int) => Int = <function2>

scala> val d=sum(_:Int,2,_:Int)
d: (Int, Int) => Int = <function2>
  1. 函数作为一等的,只有在明确需要函数作为参数的地方可以直接用函数名func,其他地方都要写成 func _ 或者 func(_)的形式,因为这样返回的是一个部分应用函数。P151
  2. 闭包:
    • 运行时,会引入自有变量的函数字面量创建出来的函数值,叫做闭包。P154
    • 闭包能感知自由变量的变化,对自由变量的改动也会反应到闭包外。P154
    • 闭包引用的自由变量的值,为闭包被创建时变量活跃的值。P155
    • 被返回的闭包,会使得自由变量在堆上继续存活。P155
    • 博主认为,直接用函数的方式,也能实现闭包。见如下代码。
var more=3
//闭包
val f=(x:Int)=> x+more

f(1) //4
more=10
f(1) //11

//函数方式
var more=3
def f4(x:Int)= x+more
f4(1) //4
more=10
f4(1) //11


//闭包引用的自由变量的值,为闭包被创建时变量活跃的值。
def f2(more:Int)= (x:Int)=> x+more //该函数每调用一次,就会返回一个闭包
val c1=f2(1)
val c999=f2(999)

c1(1) //2
c999(1) //1000

//局部函数方式
def f3(more:Int)={
    def closure(x:Int)={
        x+more
    }
    closure(_) //只写closure会报错,因为只有明确需要一个函数参数的地方,参能只写函数。
//Unapplied methods are only converted to functions when a function type is expected.
//You can make this conversion explicit by writing `closure _` or `closure(_)` instead of `closure`.
}
val c1=f3(1)
val c999=f3(999)

c1(1) //2
c999(1) //1000
  1. 重复类型参数。类型后加*,如下示例。实际上再func函数内部,args的类型是Array[T]。但又不能直接把Array类型的变量,如arr当做参数给到函数,会报错。应该要 func(arr:_*)解开。
def func(args:String*)={
	...
}

  1. 尾递归。只有在最后一步调用自己的函数,才能享受scala的尾递归优化。优化位类似使用了while的优化,使得所有调用都在同一个栈帧中执行,不会像其他语言每次调用都构建一个新的栈帧。P160
//如下两个函数,在编译后,字节码相同。
def approximate(gusess:Double):Double={
	if(isGoodEnough(guess)) guess
	else approximate(improve(guess))
}

def approximateLoop(initialGuess:Double):Double={
	var guess=initialGuess
	while(!isGoodEnough(guess))
		guess=improve(guess)
	guess
}

第9章 减少代码重复

  1. 利用高阶函数(即接收函数作为参数的函数)减少代码。P164
  2. 函数参数的表示法:
func:(Sting,String)=>Int //有参数
func: () => Int //无参数
func: => Int // 传名函数
  1. 函数柯里化。func(a:Int,b:Int)->func(a:Int)(b:Int) 柯里化实际是做了两次传统函数调用。P171
def func(a:Int,b:Int)= a+b
//柯里化定义
def func(a:Int)(b:Int)= a+b
//第一次
def first(a:Int)= a + (_ : Int)
val second = first(1)
//第二次
second(2) // 3

//从func中引用“第二步”函数
val second = func(1)_
  1. 柯里化的作用:隐式转化,更方便的组装函数
  2. 参数为单个参数时,scala允许用{}代替(),目的是为了方便程序员在{}中编写函数字面量。P175
  3. 传名参数用于替代函数参数无参数的表示。func:()=>Int 表示成 func:=>Int。传名参数完全可用传统参数替代,如funcValue:Int。但这种表达在调用函数前会被先求值,只有在明确不希望调用前参数先求值的场景下,传名参数才有用。P177

补充:
由于函数和字段在同一个命名空间,所以可以把无参函数和字段相互替换使用。即val a=”3”,可以把a当作一个无参函数使用。说明这点的作用是在做scala测试的时候,ScalaTest框架,会把测试代码当作无参函数传入test函数中。这样也利用了传名函数不会马上计算结果的特征。P260

//验证:
scala>   def strToInt(s: => String) = {s.toInt}
strToInt: (s: => String)Int
scala> val a ="3"
a: String = 3

scala> def f:String="3"
f: String

scala> strToInt(a)
res9: Int = 3

scala> strToInt(f)
res10: Int = 3

scala> strToInt("3") //可以看到,字面量”3“也可当作无参函数使用。
res11: Int = 3

掌握Scala编程:《快学Scala第二版》全面指南 Scala,作为一门集成了面向对象编程和函数式编程特性的多范式编程语言,自其诞生之初就吸引了大量的关注。本章将带你进入Scala的世界,从基础语法开始,逐步深入,帮助你搭建起对这门语言的理解框架。类型推断是指编译器根据上下文自动推断出变量或表达式的类型。在Scala中,几乎所有的类型声明都可以省略,编译器能够根据变量的初始赋值推断出其类型。这种方式不仅减少了代码的冗余,还能使代码更加简洁明了。类型推断的重要性在于它促进了更灵活的编程实践,提升了开发效率,并且使得代码更加易于维护和重构。 阅读详情

相关推荐

scala编程指南第三版

spark,scala编程指南第三版,非常好的资料,高清无水印

scala基础教程:《scala 编程(第3版)》学习笔记(全)

当作一个无参函数使用。说明这点的作用是在做scala测试的时候,ScalaTest框架,会把测试代码当作无参函数传入test函数中。这样也利用了传名函数不会马上计算结果的特征。所有需要类型参数的地方,都被认为是一个“点”,这些点可分为协变点、逆变点、不变点。由于函数和字段在同一个命名空间,所以可以把无参函数和字段相互替换使用。,Function1是逆变和协变同时存在的。本章相当于15章 的进阶版本,所以放在这里先讲。(第10章 组合和继承 会有更多详细的介绍)本章主要讨论不可变对象。new 类名(参数)

Code_LT的博客 1015

scala程序设计第三版

scala程序设计 最新版 高清,详细介绍了隐式转换、模式匹配、集合、线程和并发等

《scala 编程(第3版)》学习笔记5

所有需要类型参数的地方,都被认为是一个“点”,这些点可分为协变点、逆变点、不变点。,Function1是逆变和协变同时存在的。,scala会展开成。

Code_LT的博客 399

Scala 编程英文第三版;Programming in Scala, 3rd edition

Scala 之父第三版作品,英文版,写得比较深入浅出,强烈推荐!

《scala编程》第3版英文版&第3版源码

资源包含《Scala编程》第3版英文版和第3版源代码,Scala编程第3版,目前是最新版,支持Scala 2.11以上。《Scala编程》是Scala语言的创始人参与编写的,涵盖的语法特性非常全面,并且作者解释了为什么这么设计,有怎样的考虑,开发者应该以什么样的方式使用。 因此学习这本书,不单单是学会了scala语言本身,更重要的是扩展了视野,提升了思维能力和培养了考虑问题的思维方式方法。

《scala 编程(第3版)》学习笔记1

第1章-第6章

Code_LT的博客 555

Programming in Scala 3rd Edition 9780981531687.pdf

Programming in Scala, Third Edition 共902页 Scala 2.12

Scala之父Martin Odersky作序推荐的Scala速学版(第3版)出版

Scala 是一个很有吸引力的选择。最后但同样重要的是, Scala 是静态类型语言, 允许编译器发现错误,这样就不至于要等到程序运行起来之后才能发现这些错误, 造成时间 上的浪费。本书是一本系统地介绍Scala语言的入门图书,针对Scala 3进行了全面的更新,不仅覆盖了Scala语言的基础知识,而且涵盖了许多更复杂的概念,并最终深入到非常高级的内容。本书共分20章,首先介绍了Scala语言的基础概念,以及控制结构和函数、数组操作、映射、Option、元组、类、对象和枚举、包、导入和导出、继承、文件和。

人邮异步社区 1465

Scala编程 第3版中文版.7z

《Scala编程(第3版)》由直接参与Scala开发的一线人员编写,因而对原理的解读和应用的把握更加值得信赖。《Scala编程(第3版)》面向具有一定编程经验的开发者,目标是让读者能够全面了解和掌握Scala编程语言的核心特性,并能够深入理解Scala这门语言在设计取舍背后的动因。即便是不直接使用Scala或从事一线编程工作的读者,也能从《Scala编程(第3版)》学到大量关于函数式和面向对象的编程概念和技巧

Programming in Scala 3rd 第3版 pdf 0分

Programming in Scala 3rd 英文pdf

豆瓣9.6分,Scala编程圣经第5版隆重来袭

要说Scala编程界的圣经,那必须是这本蜚声世界的、由Scala 语言缔造者Martin Odersky编写的—— 《Scala编程》 Programming in Scala 本书全面涵盖了整个编程语言、重要类库及其背后理念,全面且强大,是Scala领域当之无愧的王者之作! 本书上市14年来,紧跟语言版本持续迭代,不断以豆瓣评分8.9、9.2、9.4的成绩刷新着领域的天花板! 其中第三版的中文版更是以9.6高分傲视群雄。 第四版的中文版也收到不少读者的好评! 如今,这部长青经典之作又迎来了一次重大

博文视点(北京)官方博客 3万+

【记录】游戏体验报告怎么写(自我成长篇)

2019年3月更新: 这个倒是不用推翻,我个人虽然写的东西还是有一些偏差的,但是“表哥”说的倒是没毛病的,这篇主要是为了记录用,具体的干货也有,都在图片里,请自行提取 =====18年初原答案 作为一个游戏策划新人,游戏分析可能抓不到点子上,试着总结记录一下游戏体验报告分析的成长(因为水平不同,视野可能也不一样,也许之后几年回头看这些东西都是小儿科或者是错误的,所以只写出当下的想...

eat_human的博客 6万+

Scala 的学习笔记

Scala 是 Scalable Language 的简写,是一门多范式的编程语言。Scala 是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。Scala 也是一种函数式语言,其函数也能当成值来使用。Scala 提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。

weixin_45866849的博客 4738

MuJoCo 相机图片怎么拿?视角调整获取物体图片及实时显示(附代码)

在Mujoco的仿真中,对于识别抓取场景来说,如何获得添加的body等物体的实时图像很重要,今天就分享下如何添加相机视角及可视化小方块(举例)的实时图片。复制一个scene.xml为scene_withcamera.xml,在xml中添加camera和小方块如下。设置xml文件中添加的相机body id。需要创建一个离屏渲染器。

darcsdn 2128

手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

一、场景 h5原生js 浏览器端解决识别二维码条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5无打包成app部署X不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用其它浏览器打开X不采用 二、思路 1.思路一:input(相机拍照)+条形码或二维码识别js支持库 通过h5-input[camera]调用相机进行拍照成图片,通过条形码等识别库解析出数据; <input @cha...

徐子厚的博客 3万+

Scala学习笔记:Scala编程进阶

Scala函数式编程、Scala中的集合、Scala高级特性

lrxcmwy2的博客 2480

UNext:基于 MLP 的快速医学图像分割网络

有代码,可深入学习轻量级分割模型的论文切入点 UNet 及其最新扩展(如 TransUNet)近年来一直是领先的医学图像分割方法。然而,这些网络无法有效地用于应用中的快速图像分割,因为它们参数繁重、计算复杂且使用缓慢。为此,我们提出了 UNeXt,它是一种基于卷积多层感知器(MLP)的图像分割网络。我们以有效的方式设计了 UNeXt,其中包括早期卷积阶段和潜在阶段的 MLP 阶段。我们提出了一个标记化的 MLP 块,我们可以在其中有效地标记和投影卷积特征,并使用 MLP 来对表示进行建模。

Philo的博客 3942

Scala编程基础

目录 一 Scala概述 1.1 什么是scala 1.2 为什么要学scala 1.3 Spark函数式编程初体验 二 Scala开发环境 2.1 安装JDK 2.2 安装Scala 2.2.1 Windows安装Scala编译器 2.2.2 Linux中安装Scala编译器 2.3 IDEA安装 2.4 Scala插件离线安装 2.5 IDEA创建Scala工程 ...

我的祖传代码 3813

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 490

spark编程基础python版 pdf_《Spark编程基础(Scala版)》.PDF

《Spark编程基础(Scala版)》.PDF《Spark编程基础(Scala版)》教材官网:/post/spark/温馨提示:编辑幻灯片母版,可以修改每页PPT的厦大校徽和底部文字《Spark编程基础(Scala版)》课程介绍(PPT版本号:2018年春季学期)林子雨厦门大学计算机科学系扫一扫访问教材官网 E-mail: ziyulin@主页:/...

weixin_39936792的博客 3702

【牛客算法】小美的数组删除

本文分析了小美数组删除问题的解法,提出了一种逆向遍历求MEX的优化算法。该算法通过从数组末尾开始遍历,逐步构建子数组集合,利用MEX的单调性和增量更新特性,在O(n)时间复杂度内计算所有可能删除方案的最小代价。关键设计包括:1)逆向遍历实现MEX状态继承;2)利用HashSet快速判断元素存在;3)动态比较删除前j个元素和删除整个子数组的代价。算法空间复杂度为O(n),适用于大规模数据。代码实现简洁高效,已被验证为同类问题的最优解之一。

字节卷动 1336

Scala宏编程:探索Scala 3的宏支持

Scala宏编程:探索Scala 3的宏支持 项目介绍 Scala宏编程项目是一个专注于Scala语言宏编程的开源项目。尽管该项目目前已不再进行开发,但它为我们提供了一个宝贵的资源,帮助我们理解Scala宏编程的基本概念和实现方式。对于那些希望深入了解Scala宏编程的开发者来说,这个项目仍然具有很高的参考价值。 项目技术分析 Scala宏编程项目主要基于Scala的scala-reflect库,...

gitblog_00032的博客 549

数据库常见面试题(附答案)

1.事务四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前,其它会话不能看到过程 一致性,事务前后,数据总额一致 持久性,一旦事务提交,对数据的改变就是永久的 2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别 脏读:事务B读取事务A还没有提交的数据 不可重复读:两次事务读的数据不一致 幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看...

csdn问鼎 46万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Scala编程指南-第二版

Scala Language 语言介绍 Scala是一门多范式的编程语言,同时支持面向对象和面向函数编程风格。它以一种优雅的方式解决现实问题。虽然它是强静态类型的编程语言,但是它强大的类型推断能力,使其看起来就像是一个动态编程语言一样。Scala语言最终会被翻译成java字节码文件,可以无缝的和JVM集成,并且可以使用Scala调用java的代码库。除了Scala编程语言自身的特性以外,目前比较流...

麦田里的守望者-蒋中洲【相信相信的力量】 881

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Scala 中的集合(二):集合性能比较
下一篇: Scala,Spark依赖jar包冲突解决方法
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值