中关村村草 发表于 2011-03-16 13:02

A.7 字符串

A.7 字符串


一系列字符可以用一对单引号或双引号括起来成为字符串。Ruby的字符串是String类的对象。单引号和双引号括起来的字符串并不完全相同,比如:ok = \"OK\"

puts \"Hello -> #{ok}\" # 输出:Hello -> OK
puts \'Hello -> #{ok}\' # 输出:Hello -> #{ok}
从上面的例子可以看出:单引号的字符串会进行较少的表达式替换,双引号的字符串会进行更多的表达式替换。
单引号和双引号的多行字符串表示也可以换为用%表示。我们来看看下面的多行字符串表示:OK = \"Ruby\"

puts %/#{OK}
.hello/

puts %Q[#{OK}
.hello]

puts %q{#{OK}
.hello}

puts %(/#{OK}
.hello)
我们发现,%表示多行字符串时,单独一个%和%Q的作用是一样的——同双引号功能一样。%q的功能和单引号表示一样。另外在这种表示法中你可以在%、%Q、%q后面用{{[和]}}括号把多行字符串括起来。
在Ruby中字符串的处理非常重要,字符串类中也定义了很多的处理字符串的方法。同时Ruby也定义了一种多行字符串的表示方式,被称为Here Document。它的语法格式如下:

<<标识字符串
内容
标识字符串

这里标识字符串要紧接着<<书写,并且前后两个标识字符串在形式上要相同:ok = \"Ruby\"

puts < hello, world!
----ya!ya. #{ok}
ok
除非,你用单引号和双引号把第一个标识字符串括起来,来执行特定的替换功能:ok = \"Ruby\"

puts <<\"ok\"
hello, world!
----ya!ya. #{ok}
ok

puts <<\'ok\'
hello, world!
----ya!ya. #{ok}
ok 上面两段代码说明:标识符被双引号括起来和没有括起来在效果上是一样的。
一般情况下结尾的标识符必须顶格写,当然在<<后面加上- (减号)时,结尾的标识符可以缩进书写:ok = \"Ruby\"

puts <<-ok
hello, world!
----ya!ya. #{ok}
ok 下面的代码也许会让你觉得奇怪:ok = \"Ruby\"
puts <<-ok, <<-hello
hello, world!
----ya!ya. #{ok}
ok
#{ok}
hello 它输出:

hello, world!
----ya!ya. Ruby
Ruby
Ruby的作者是这样解释的:<<标识符和结尾的标识符并不是一个整体,而“<<标识符”代表的就是多行字符串的内容,这些内容从“<<标识符”的第二行开始,到结尾字符串为止。这就出现了一个很有意思的语法:def hello(str1, str2)
puts str1
puts str2
end

hello(\"Ruby\", <<-hello)
hello!
hello 同样,下面的代码段也饶有趣味:puts <<hello.insert(1, \\" hello\\")
hello
hello如果你把第二行的哪个hello顶格写将会发生IndexError,为什么?这当作这一讲的第一道作业题。
更让你惊奇的是下面这个程序:def ok(arg1, arg2, arg3)puts arg1
puts arg2
puts \\"OK, \\" + arg3
end

ok(<<hello, \\"Ruby\\", \\"Lua\\") #要求写在一行上
hello, Ruby
hello
只要下面这行:

ok(<
不分开行写——即就在一行上面,Ruby解释器会正常工作!(为什么?本讲第二个作业题。)
这一点对于用Ruby来做文档处理有很大的帮助,特别地,用这个技巧再结合序列化的相关技巧,你可以做出相当精彩的文稿处理。。

2gua 发表于 2011-03-16 13:34

村艹,整理成系列教程哦。

gr33n 发表于 2011-11-29 19:57

相当精彩的文稿。
页: [1]
查看完整版本: A.7 字符串