定义:双引号内存放文字的字符串对象。使用场景:推荐用来定义复杂的字符串(包括转义符或者表达式插值操作)。实例:# 输出一段文字puts "Hello Ruby!"# ---- 输出结果 ----Hello Ruby!当使用双引号创建字符串对象时,首先他会查找以反斜杠\开头的字符,进行转义操作,其中最常见转义符为\n,它叫做换行符,当输出包含换行符的字符串的时候,\n会被强制转换为换行。实例:# 输出带有换行符的字符串puts "Goodnight,\nAlice"# ---- 输出结果 ----Goodnight,Alice其次,双引号字符串做的第二件事是表达式插值,在字符串中,#{表达式}会被表达式的结果替换。实例:# 表达式插值name = 'Alice' #定义一个局部变量name,这里的字符串单引号双引号均可puts "Goodnight, #{name}"# ---- 输出结果 ----Goodnight, Alice表达式也可以是数学运算。实例:x, y, z = 12, 36, 72puts "x 的值为 #{ x }"puts "x + y 的值为 #{ x + y }"puts "x + y + z 的平均值为 #{ (x + y + z)/3 }"# ---- 输出结果 ----x 的值为 12x + y 的值为 48x + y + z 的平均值为 40如果表达式只是全局变量$,类变量@@或实例变量@,则可以省略花括号。变量类型将在之后章节给大家普及。实例:puts "This is line #$."# ---- 输出结果 ----This is line 1经验:除了#{}这种表达式插值的形式,使用+也可以进行字符串拼接操作,但是要求进行拼接的两个变量的类型一定是字符串,否则会抛出异常,Ruby 会将#{}表达式中的结果强制转化为字符串,我们不需要关心变量的类型,只需要关心拼接的操作。所以,最好不使用+来拼接字符串。对比下面两种情况:x = 12puts "x 的值为 #{x}"# ---- 输出结果 ----x 的值为 12x = 12puts "x 的值为 " + x# ---- 输出结果 ----Traceback (most recent call last): 1: from ruby.rb:2:in `<main>'ruby.rb:2:in `+': no implicit conversion of Integer into String (TypeError)而这样就不会抛出异常:x = 12puts "x 的值为 " + x.to_s # 将12从数字转化成字符串# ---- 输出结果 ----x 的值为 12
定义:单引号内存放文字的字符串对象。除少数情况,单引号中的内容将成为字符串的值。使用场景:定义简单的字符串(不包含转义符以及表达式插值操作)。实例:puts 'Hello Ruby!'# ---- 输出结果 ----Hello Ruby! 当您想要在单引号字符串中使用单引号'时,为了不要让 Ruby 将输入的单引号理解为终止符号,您需要使用反斜杠\。实例:# 输出带有'的单引号字符串puts 'What\'s your name?'# ---- 输出结果 ----What's your name? 两个连续的反斜杠\\被单个反斜杠替换。实例:# 在单引号字符串中输入两个反斜杠puts 'escape using "\\"'# ---- 输出结果 ----escape using "\"
定义:%q同单引号规则,%Q同双引号规则。使用场景:定义多行字符串。在q和Q之后的字符是分隔符,如果是[、{、(、!或<则将读取字符串,直到找到匹配的结束符号,否则将一直读取字符直到下一次出现相同的分隔符为止。实例:%q/生成单引号字符/ # 相当于 '生成单引号字符'%Q!生成双引号字符! # 相当于 "生成双引号字符"%Q{Seconds/day: #{24*60*60}} #相当于 "Seconds/day: #{24*60*60}"# ---- 输出结果 ----生成单引号字符生成双引号字符Seconds/day: 86400
在 Groovy 中,字符串较 Java 中比较特殊,在 Java 中我们用单引号(’’)来表示 char,用双引号("")表示字符串。但是在 Groovy 中字符串不仅可以用双引号 (""),而且单引号 (’’),三引号 ("’’")也可以。我们看下下面这个例子:class Example { static void main(String[] args) { String a = '单引号'; String b = "双引号"; String c = '''这是三引号 Gradle专题 Groovy语言基础'''; println(a); println(b); println(c); } }最终输出结果为:单引号双引号这是三引号 Gradle专题 Groovy语言基础我们发现三引号(’’’ ‘’’)其实还可以换行,多行字符串也可以用三引号(’’’ ‘’’)来引用。不像 Java 一样我们如果字符串换行还需要用“ + 和 \n”连接起来。
字符串由字符组成,字符串在使用的时候会使用双引号(")或者单引号(')包裹。var str1 = '字符串';var str2 = "字符串";console.log(str1); // 输出:"字符串"console.log(str2); // 输出:"字符串"上述例子中,两个变量都是字符串类型的,可以双引号和单引号包裹的结果是一样的。但是如果需要在双引号包裹的字符串中使用双引号,或者在单引号包裹的字符串中使用单引号,需要使用\进行转义,否则会报错,因为 JavaScript 无法知道字符串的结束位置。var str1 = '使\'用\'单\'引\'号';var str2 = "使\"用\"双\"引\"号";console.log(str1); // 输出:"使'用'单'引'号"console.log(str2); // 输出:"使"用"双"引"号"// 以下代码会报错var str3 = "哼"!";var str4 = ''哼!';大部分开发者会使用单引号包裹字符串。因为为了网页的动态展示、复杂交互等,需要用 JavaScript 书写 HTML 模版,而 HTML 的属性按照习惯是使用双引号包裹的(XML 标准允许单引号和双引号,在 HTML5 的标准中甚至不需要书写引号)。这样如果使用 JavaScript 中的字符串表示 HTML 就会变成如下情况:var html = "<div class=\"title text-red\" style=\"display: inline-block;\">我是一个红色的标题</div>";为了契合书写 HTML 的习惯,防止代码中充斥的大量的转义,就会使用如下使用单引号的形式。var html = '<div class="title text-red" style="display: inline-block;">我是一个红色的标题</div>';
成员引用由类、双冒号、成员三个部分组成:
字符串类型的数据表示一段文本,使用单引号或者双引号创建:单引号字符串 ‘hello’双引号字符串 “world”在 python 中使用字符串的例子如下:>>> x = 'hello'>>> x'hello'>>> y = "world">>> y'world'在第 1 行,创建了使用单引号字符串 hello,并将值赋给变量 x 在第 2 行,显示变量 x 的值为 ‘hello’在第 3 行,创建了使用双引号字符串 world,并将值赋给变量 y 在第 4 行,显示变量 y 的值为 ‘world’使用单引号或者双引号创建的字符串只能在一行,而使用三引号允许一个跨多行的字符串。使用 3 个单引号创建的多行字符串示例如下:s = '''line 1line 2line 3'''print(s)使用 3 个双引号创建的多行字符串示例如下:s = """line 1line 2line 3"""print(s)以上程序的输出如下:line 1line 2line 3
转义可以理解成字面意思,即转换字符的含义。比如想在字符串里描述换行符,就会使用 \n。var str = '第一行\n第二行\n第三行';console.log(str); // 将会输出换行的字符串通常转义字符都是通过 \ 开头的。同理,如果需要在双引号包裹的字符串中使用双引号,或者单引号包裹的字符串中使用单引号,就需要对引号进行转义。var str = '我'要'显'示'一'堆'单'引'号';这样就会报错,JavaScript 无法知道这些引号的含义。var str = '我\'要\'显\'示\'一\'堆\'单\'引\'号';通过 \n 表示一个单引号,就可以让 JavaScript 理解,需要在字符串里描述一个单引号。
字符串类型的数据表示一段文本,使用单引号、双引号创建,例如:单引号字符串 ‘hello’双引号字符串 “hello”字符串通常用于文本的连接,例如:连接两个字符串,形成一个新的字符串>>> 'Hello' + 'World''HelloWorld'连接三个字符串,形成一个新的字符串>>> 'Hello' + ':' + 'World''Hello:World'
双引号或者单引号表示字符串:let protagonist: string = "Sherlock Holmes"let partner: string = 'Dr. John Hamish Watson'使用模板字符串:let protagonist: string = 'Sherlock'let sentence: string = `华生是${protagonist}的朋友、助手和室友。`模板字符串使用反引号来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法 ${expression} 的占位符,占位符内可以写变量名,模板字符串会进行变量值的解析。
JavaScript 支持以下字符的转义: \' 单引号 \" 双引号 \& 和号 \\ 反斜杠 \n 换行符 \r 回车符 \t 制表符 \b 退格符 \f 换页符
变量与值直接使用 “=” 连接,等号两边不能存在空白字符;例如: dirname = "/tmp" 赋值方法就是错误的。如果值中有空白字符,使用单引号或双引号引起来,双引号对于其中引用的值将会根据其内容转化,单引号内的特殊字符则一律当字符串进行处理;例如:DIRNAME="$PATH" 的值为系统 PATH 实际的可执行文件路径,DIRNAME='$PATH' 的值为 $PATH 的字符串。可用 \ 来转译变量,让其变为一般字符;例如:DIRNAME=\$PATH 的值为 $PATH 的字符串。如果变量的值为指令,可用使用反撇号,或 $() 来引用;例如:下面两个是一样的 DATE=`date`DATE=$(date)在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来;例如:DIRNAME="/tmp"单纯数字的变量内容可以不加引号;例如:NUM=10
jsonb 创建索引也十分简单,以上面的 movie 表为例:CREATE INDEX movie_info_gin_index ON movie USING gin(info);movie_info_gin_index是索引名称,gin(info)括号里面的 info 表示使用 movie 表中的 info 字段创建索引。
定义:类索引(this_class)和父类索引(super_class)都是一个 u2 大小的数据。类索引:确定当前类的全限定名。父类索引:确定当前类的父类的全限定名。Tips:由于 Java 单继承的原则,父类只可能有一个;由于 Object 是所有其他类的基类,所以除了 Object 类没有父类以外,其余所有类的 super_class 都不为空。无符号数结构示意图:类索引是紧跟在访问标志之后的结构,类索引后边紧跟的结构是父类索引。由于类索引与父类索引关系非常紧密,都是描述的当前类以及当前类的父类的全限定名,所以此处我们将二者放在一起进行讲解。
对于静态字符串一律使用单引号,不使用双引号。在拼接字符串的时候需要使用反引号的方式,更加易于阅读。// badconst name = "imooc";const info = name + ' ES6 Wiki';// goodconst name = 'imooc';const info = `${name} ES6 Wiki`;
使用字符串字面量就可以创建字符串。var str1 = '';var str2 = "";以上例子创建了两个空字符串。字符串可以用单引号包裹,也可以用双引号包裹,效果是一样的。大部分前端程序员都会选择单引号,这么做的原因是为了契合 HTML 的书写习惯,拼接 HTML 的时候,HTML 元素的属性可以直接使用双引号包裹。var html = '<p class="tip">更多请<a href="/detail" target="_blank">了解详情</a></p>';如果换成双引号则需要转义:var html = "<p class=\"tip\">更多请<a href=\"/detail\" target=\"_blank\">了解详情</a></p>";
以 # 开头的注释可以注释一行文本,Python 另外提供了注释多行文本的功能。多行注释用三个单引号 ‘’’ 或者三个双引号 “”" 将注释括起来,例如:使用3个单引号注释多行文本'''# 首先定义变量 x# 让后将变量 x 修改为 456x = 123x = 456'''使用3个双引号注释多行文本"""# 首先定义变量 x# 让后将变量 x 修改为 456x = 123x = 456"""
标签的属性,如果是标签为双标签,则属性写在头标签中(头标签的<>内), 如果是单标签,则写在标签的<>内。 <a href='https://www.baidu.com'>百度</a> <!-- 双标签的属性写在头标签的<>内 --> <img src='https://www.imooc.com/static/img/index/logo.png' alt='慕课logo'> <!-- 单标签的属性写在标签的<>内 -->总结:标签的属性有三部分构成,属性名,等号,属性值,等号左边的为属性名,等号右边的为属性值,属性值必须由引号引起来,单引号和双引号都可以。标签的属性用来给标签添加属性,让标签有特点的作用。
在使用 Shell 变量前,需要先定义变量,定义变量的方式有三种:2.1.1 直接赋值顾名思义就是直接将一个值赋值给一个变量名称,这种需要注意值中不能包含空白字符例如:正确的直接赋值变量:DIR=/tmp,其中 DIR 为变量名,/tmp 为值错误的直接赋值:STRING=hello Shell,其中 STRINNG 为变量名,hello Shell 为值,其中值包含了空白字符,这种赋值变量就是错误的。2.1.2 单引号赋值如果值中为普通字符,那么单引号赋值与双引号赋值没有区别,其可以包含空白字符,但是如果其中包含了变量的使用,那么单引号赋值方式为单引号里面的内容是什么就输出什么,此种赋值方式适用于不希望解析变量的场景,仅显示纯字符串。例如:[root@master ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# DIR='$PATH'[root@master ~]# echo $DIR$PATH[root@master ~]# DATE='$(date)'[root@master ~]# echo $DATE$(date)PATH 为 linux 系统内置的一个环境变量,DIR 为我们定义的变量,值为单引号引起来的 $PATH,查看其内容也为 $PATH,同理对于执行 date 命令。2.1.3 双引号赋值与单引号赋值一样,其也可以包含空白字符,但是与单引号赋值不同的是,双引号赋值可以解析引号内的变量或执行命令,即不是将双引号中的变量名和命令原样输出,而是解析其中变量的内容,然后进行输出。例如:[root@master ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# DIR="$PATH"[root@master ~]# echo $DIR/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@master ~]# DATE="$(date)" [root@master ~]# echo $DATE Sun Mar 8 22:13:57 CST 2020可以通过与单引号示例对照查看,双引号赋值解析了 PATH 变量的值然后输出,同理对于执行命令 date。
在 Markdown 文件中,用「大于号」开头的行会被转换为块引用。实例 1:这是一段普通的文本内容。“一支穿云箭,千军万马来相见;两副忠义胆,刀山火海提命现。” —— 星仔其默认渲染效果如下实例 2:在行首加入「大于号 >」,将其改变为块引用。> “一支穿云箭,千军万马来相见;两副忠义胆,刀山火海提命现。” —— 星仔其修改后渲染效果如下:实例 3:如果需要在块引用内的换行,可以在行尾增加两个连续的空格。> 一支穿云箭,千军万马来相见; > 两副忠义胆,刀山火海提命现。 > —— 星仔其渲染效果如下:实例 4:这一写法还可以简化成只在第一行加入引用符号。> 一支穿云箭,千军万马来相见; 两副忠义胆,刀山火海提命现。 —— 星仔其渲染效果与以前一样:实例 5:如果需要在块引用里分段,只要在块引用内增加由块引用符号开启的空行即可。> 一支穿云箭,千军万马来相见;>> 两副忠义胆,刀山火海提命现。>> —— 星仔其渲染结果如下:块引用会被渲染成 html 的 blockquote 标签:<blockquote><p>"一支穿云箭,千军万马来相见;两副忠义胆,刀山火海提命现。" —— 星仔</p></blockquote>
成员引用最常见的使用方式就是类名+双冒号+成员(属性或函数):fun main(args: Array<String>) { val persons = listOf(Person(name = "imooc1", age = 18), Person(name = "imooc2", age = 20), Person(name = "imooc3", age = 16)) println(persons.maxBy(Person::age))//成员引用的类型和maxBy传入的lambda表达式类型一致}省略类名直接引用顶层函数:package com.imooc.lambdafun salute() = print("imooc")fun main(args: Array<String>) { run(::salute)}成员引用用于扩展函数:fun Person.isChild() = age < 18fun main(args: Array<String>){ val isChild = Person::isChild println(isChild)}
父类索引后边紧跟的是接口索引计数器,接口索引计数器后边紧跟的是接口索引集合。类似于常量池计数器和常量池的关系,接口索引计数器记录的是接口索引集合中接口索引的数量。Tips:对于常量池计数器和常量池,一个是无符号数类型,一个是表类型。相比而言,接口索引计数器和接口索引集合皆为无符号数类型,这里学习者可以进行对比记忆。我们继续来看下两者的定义以及无符号数类型的结构示意图。定义:接口索引计数器:代表了接口索引集合中接口的数量;接口索引集合:按照当前类 implements(或当前接口extends)的接口的顺序,从左到右依次排列在接口索引集合中,此部分集合称为接口索引集合。无符号数结构示意图:接口索引计数器和接口索引集合均为无符号数类型结构,结构示意图如下图所示。从图中可以看出,接口索引计数器占用了 2 个字节,为 u2 大小,接口索引集合中的每一个接口元素占用了 2 个字节大小,也为 u2 大小。Tips:接口索引集合后边紧跟的数据结构是什么?我们继续抛出问题,后续章节会有问题的解答,让我们带着问题继续探究 Class 文件结构。
在 echo 变量引用时,我们推荐勤用引号,单引号为原样输出字符串,双引号为输出变量的值;printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植更好,如果后期考虑平台移植问题,建议使用 printf。
将下面的代码粘贴到代码块文件的右侧区域。实例:"uImooc": { "body": [ "<view class=${1:imooc1/imooc2/imooc3}>", "\t<view class=\"imooc4\">", "\t$0", "\t</view>", "</view>" ], "prefix": "uimooc", "project": "uni-app", "scope": "source.vue.html"}Tips:要注意代码块的最外层有一对大括号,所有的代码块都要包裹在这个大括号中;多个代码块之间要用英文逗号隔开;body 配置项中,每一行都要用双引号包围,并用逗号分隔。代码中出现双引号使用"转义,或者使用单引号代替。缩进需要用 \t 表示,不能直接输入缩进或空格。
学前疑问:学习者可能会有疑问,为什么标题说的是次版本号与主版本号,次版本号在前,而主版本号在后呢?先次后主,是不是读起来感觉有点别扭呢?疑问解答:特别强调下,对于Class 文件结构,第一部分为 u4 的魔数,魔数后边紧跟的就是 u2 的次版本号,次版本号后边才是 u2 的主版本号,此处需要特别注意,从结构上来说,次版本号在前,主版本号在后。定义:次版本号与主版本号共同标识了我们所使用的的 JDK 版本,如 JDK 1.8.0 版本的次版本号为 u2 大小,用字节码表示为 00 00,主版本号也是 u2 大小,用字节码表示为 00 34。次版本号:JDK 版本的小版本号;主版本号:JDK 版本的大版本号。Tips:如果 Class 文件的开头 8 个字节分别为 CA FE BA BE 00 00 00 34,那么我们可以确定,这是一个 JVM 可识别的 Class 文件,且使用的 JDK 1.8.0的版本进行的编译,因为前4个字节魔数为 CA FE BA BE 符合标准,后4 个字节 00 00 00 34 为 JDK 1.8.0的版本。无符号数结构示意图:前文提到,次版本号与主版本号也是无符号数类型的数据。我们接下来看下魔数的示意图:Tips:至此我们了解了先次后主,了解了次版本号与主版本号分别占用 2 个字节,无符号数表示为 u2。同时我们从整体上了解了,魔数后边为次版本号,次版本号后边为主版本号。主版本号后边紧跟的是什么?不要着急,我们继续学习。版本号对照表:开篇的前言部分已经说过,对照表部分为了解内容,这里简单举出几个版本的对照表,了解一下即可。JDK 版本16进制字节码1.8.000 00 00 341.7.000 00 00 331.6.000 00 00 321.5.000 00 00 31
字符串就是由一些列的字符用双引号包围。例如:Tips:这里的双引号(" ")是在英文输入法下输入的引号,不是中文输入法中的引号。这点在系统中同时有中文和英文输入法的环境下很容易引起错误。"hello world!""This is a lesson for C language."
Spring Boot 配置项是可以引用其他配置项的值的,这个稍微提一下,例如:实例:# wxmp.properties# 公众号的appidwxmp.appid=111# 公众号的secret,值为111222wxmp.secret=${wxmp.appid}222
逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
创建字符串对象的方法有很多种,最常用的创建方式是使用字符串文字:单引号或双引号之间的字符序列。两种形式之间的区别是 Ruby 在构造文字时对字符串进行的处理量。
信号(Signal)是 Unix 系统中就已有的 IPC 方式,继承于 Unix 的 Linux 系统和 MacOS 系统也具有相同的通信方式。信号的工作原理是向某个进程发送特定的消息,目标进程在收到消息之后,就知道特定事件已经发生,此时进程可以忽略消息即不做处理,或者是处理消息调用固定的函数。以 MacOS 为例,在 shell 终端输入 kill -l 可以列出支出的全部信号名称:HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP。MacOS 支持的信号列表