免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3543 | 回复: 2
打印 上一主题 下一主题

A.7 字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-16 13:02 |只看该作者 |倒序浏览
A.7 字符串


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

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

  2. puts %/#{OK}
  3. .hello/

  4. puts %Q[#{OK}
  5. .hello]

  6. puts %q{#{OK}
  7. .hello}

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

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

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

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

  2. puts <<\"ok\"
  3. hello, world!
  4. ----ya!ya. #{ok}
  5. ok

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

  2. puts <<-ok
  3. hello, world!
  4. ----ya!ya. #{ok}
  5. ok
复制代码
下面的代码也许会让你觉得奇怪:
  1. ok = \"Ruby\"
  2. puts <<-ok, <<-hello
  3. hello, world!
  4. ----ya!ya. #{ok}
  5. ok
  6. #{ok}
  7. hello
复制代码
它输出:

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

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

  5. ok(<<hello, \\"Ruby\\", \\"Lua\\") #要求写在一行上
  6. hello, Ruby
  7. hello
复制代码
只要下面这行:

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

论坛徽章:
0
2 [报告]
发表于 2011-03-16 13:34 |只看该作者
村艹,整理成系列教程哦。

论坛徽章:
0
3 [报告]
发表于 2011-11-29 19:57 |只看该作者
相当精彩的文稿。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP