字符串的创建可以通过""双引号或者''单引号进行创建
双引号的可以通过#{}的方式取出变量名的内容,单引号不行,输入什么,输出就是什么
irb(main):016:0> desc = %Q(Ruby的字符串用''和"") => "Ruby的字符串用''和\"\"" irb(main):017:0> puts desc Ruby的字符串用''和"" => nil irb(main):018:0> str = %q(Ruby的字符串用''和"") => "Ruby的字符串用''和\"\"" irb(main):019:0> puts str Ruby的字符串用''和"" => nil irb(main):020:0> p str "Ruby的字符串用''和\"\"" => "Ruby的字符串用''和\"\"" irb(main):021:0> p desc "Ruby的字符串用''和\"\"" => "Ruby的字符串用''和\"\"" irb(main):022:0>
使用%q可以不用使用转义输出""或者''实际测试,q大写与小写没有区别
使用Here Document
Here Document来源与shell的一种程序写法,使用<<来创建字符串
标准版写法
<<"结束标识符"
字符串内容
结束标识符
结束标识符可以用""或者''。区别见前面,如果啥度没写,默认的效果等于""
使用EOF "End Of File"的缩写,或者EOB "End of Block"的缩写
Here Document的结束标识符一定要在行首
irb(main):022:0> 10.times do |i| irb(main):023:1* print(<<"EOB") irb(main):024:2" i:#{i} irb(main):025:2" EOB irb(main):026:1> end i:0 i:1 i:2 i:3 i:4 i:5 i:6 i:7 i:8 i:9 => 10
这样缩进不好看,可以通过<<-,这样程序会忽略结束标识符前的空格和制表符,结束标识符可以不在行首了
irb(main):027:0> 10.times do |i| irb(main):028:1* print(<<-EOB) irb(main):029:2" i: #{i} irb(main):030:2" EOB irb(main):031:1> end i: 0 i: 1 i: 2 i: 3 i: 4 i: 5 i: 6 i: 7 i: 8 i: 9 => 10 irb(main):032:0>
可以用<<~来忽略行首的空白,这样一来.i :#{i}也可以缩进了
irb(main):032:0> 10.times do |i| irb(main):033:1* print(<<~EOB) irb(main):034:2" i: #{i} irb(main):035:2" EOB irb(main):036:1> end i: 0 i: 1 i: 2 i: 3 i: 4 i: 5 i: 6 i: 7 i: 8 i: 9 => 10
还可以通过Here Document赋值给变量
irb(main):037:0> str = <<~EOB irb(main):038:0" hello irb(main):039:0" world irb(main):040:0" EOB => "hello\nworld\n" irb(main):041:0> puts str hello world => nil irb(main):042:0>
sprintf等于format
脚本里面使用``来调用linux命令,这个跟shell脚本一样
irb(main):044:0> info = `who am i` => "sjz pts/105 2020-06-05 16:08 (172.168.131.111)\n" irb(main):045:0> puts info sjz pts/105 2020-06-05 16:08 (172.168.131.111) => nil irb(main):046:0>
printf 与 sprontf方法
printf与C语言的操作的比较像
sprintf与Python中的format差不多
irb(main):046:0> n = 65535 => 65535 irb(main):047:0> printf("%d用十六进制表示为&x\n",n,n) 65535用十六进制表示为&x => nil irb(main):048:0> printf("%d用十六进制表示为%x\n",n,n) 65535用十六进制表示为ffff => nil irb(main):050:0> p sprintf("%d用十六进制表示为%x\n",n,n) "65535用十六进制表示为ffff\n" => "65535用十六进制表示为ffff\n" irb(main):051:0>
sprintf与format使用一样
irb(main):051:0> p format("Hello, %s!","Ruby") "Hello, Ruby!" => "Hello, Ruby!" irb(main):052:0> format("Hello, %s!","Ruby") => "Hello, Ruby!" irb(main):053:0>
标记、最小宽度、精度跟Python的print %格式化输出差不多
#b %B、%o、%x、%X,输出加上前缀后的结果(0b、0B、0、0x、0X)
书写的真的很烂,直接上一些代码,演示下算了
>> printf("%8s", "Ruby") Ruby=> nil >> printf("%8.8s", "Hello Ruby") Hello Ru=> nil >> printf("%#010x", 100) 0x00000064=> nil >> printf("%#020x", 100) 0x000000000000000064=> nil >> printf("%+ .2f", Math::PI) +3.14=> nil >> printf("%*.*f",5,2, Math::PI) 3.14=> nil >>
获取字符串的长度
.length或.size获取字符长度 .bytesize获取字节长度,.empty?查寻是否为空
字符串的索引