`
hideto
  • 浏览: 2683273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

每天一条Ruby小道之与字符串共舞

    博客分类:
  • Ruby
阅读更多
1,字符串表达方式
s = 'abc'
s = "abc"
s = %q[abc]
s = %Q[abc]
s = %q(abc)
s = %q{abc}
s = %q<abc>
s = %q:abc:
s = %q*abc*
...

上面的例子都是合法的字符串表达方式。
当使用%q或%Q符号表示字符串时,界定符可以是任何成对界定符([]、<>等)或非数字、非空格、可打印的非成对单字符(:、#、@等)。

2,here-document
对较长的多行字符串,可以使用here-document来的方式表示:
str = <<EOF
  Once upon a midnight dreary,
  While I pondered weak and weary,...
EOF

<<符号后面接一个结束符,用来标识在两个结束符之间的内容为字符串str的内容。
默认时here-document为一个双引号标识的字符串,这样可以在字符串里嵌入\t,\n,#{}等特殊符号并计算其值
而我们可以显示指定单引号的结束符来让我们得到一个单引号标识的字符串:
str = <<'EOF'
This isn't a tab: \t
and this isn't a newline: \n
EOF

默认时在结束符前加空格缩进或者在结束符后加空格的话,here-document不会认为这是合法的结束符。
但是我们可以使用<<-来删除结束符前面的空格缩进,但不会删除后面的空格和其他行的缩进:
str = <<-EOF
    Each of these lines
    starts with a pair
    of blank spaces.
  EOF

我们有这种形式的here-document应用:
class String
  def margin
    arr = self.split("\n")
    arr.map! {|x| x.sub!(/\s*\|/, "")}
    str = arr.join("\n")
    self.replace(str)
  end
end

str = <<end.margin
  |This here-document has a "left margin"
  |at the vertical bar on each line.
  |
  |  We can do inset quotations,
  |  hanging indentions, and so on.
end

这样得到的str会调用margin方法来去掉每行开始的缩进和“|”字符。

here-document是我们给class_eval方法传参时经常用到的,比如ActiveRecord的associations.rb里的一段代码:
class_eval <<-end_eval
  alias_method :#{old_method}, :destroy_without_callbacks
  def destroy_without_callbacks
    #{reflection.name}.clear
    #{old_method}
  end
end_eval


3,处理多行字符串
str = "Once upon\na time...\nThe End\n"
num = 0
str.each do |line|
  num += 1
  print "Line #{num}: #{line}"
end

可以使用each来对多行字符串进行一行一行的处理,比如读取一个文件,每行加上行号。
上面的代码得到的str打印出来为:
Line 1: Once upon
Line 2: a time...
Line 3: The End

4,字符串与字节
由于目前Ruby不是完全国际化的,一个ASCII字符本质上是一个byte,而字符串则是字节序列,我们可以这样按顺序处理字符串:
str = "ABC"
str.each_byte {|char| print char, " "}
# 结果为65 66 67

如果字符串里包含中文的话,一个中文字符会用两个byte来存储,应该为Unicode形式,后面第四章会详细讨论国际化和Unicode。

5,字符串里嵌入表达式
变量可以用#{}来在字符串里求值:
a = 1
puts "a = #{a}"

完整的语句也可以:
str = "The answer is #{ def factorial(n)
                          n == 0 ? 1 : n*factorial(n-1)
                        end

                        answer = factorial(3) * 7}, of course."

对于全局变量、类变量和实例变量在字符串中的使用:
$a = 1
@@b = 2
@c = 3
print "$a = #$a and @@b = #@@b and @c = #@c."


6,字符串迟求值
proc
str = proc {|a,b| "a = #{a}, b = #{b}"}
str.call(1, 2)
# => "a = 1, b = 2"

eval
str = 'a = #{a}, b = #{b}'
a, b = 1, 2
eval('"' + str + '"')
# => "a = 1, b = 2"

binding
bind = proc do
  a, b = 1, 2
  binding
end.call
eval('"' + str + '"', bind)
# => "a = 1, b = 2"


后面就是一些String的api讲解,这里就不介绍了。
分享到:
评论
1 楼 lgn21st 2007-07-29  
真棒,非常详细!

相关推荐

    ruby的二进制字符串与hex互转,二进制字符串与整数互转的工具函数

    本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...

    Ruby-Unicode字符串调试帮助

    2. **码点与图形字符**:Ruby中的`codepoints`方法返回字符串中每个字符的Unicode码点,这是一个整数值。码点并不总是直接对应于屏幕上看到的字符,因为某些码点可能表示组合字符序列。使用`String#chars`或`String#...

    Ruby-Stringex一些实用的Ruby字符串扩展类

    在Ruby的世界里,字符串操作是常见的任务之一。为了增强字符串处理能力,开发者们创建了许多库,其中Stringex是一个非常实用的扩展库。本文将深入探讨Stringex库,介绍其提供的各种实用方法,帮助你更好地理解和利用...

    Ruby-GeoPattern从字符串创建漂亮的生成几何背景图像

    Ruby-GeoPattern是一个开源库,由Jason Long 创建,它允许开发者根据输入的任意字符串生成美观的几何背景图像。这些图像可以用于网站设计、图形艺术或其他任何需要独特视觉元素的地方。GeoPattern利用了Ruby语言的...

    Ruby 字符串处理

    Ruby将字符串像数字一样处理.我们用单引号(‘…’)或双引号(…)将它们括起来. ruby&gt; abc  abc ruby&gt; ‘abc’  abc 单引号和双引号在某些情况下有不同的作用.一个由双引号括起来的字符串允许字符由一个前置的斜杠...

    ruby基础教程(第四版)第14章 字符串类1

    Ruby中的字符串还与数组共享一些方法,比如 `each_line`、`each_byte` 和 `each_char`,它们都可以返回 `Enumerator` 对象。`Enumerator` 模块提供了一套灵活的方法,使得可以在不提供块的情况下对这些方法进行后续...

    Ruby中常用的字符串处理函数使用实例

    2.判断字符串中是否包含另一个串 代码如下: str.include? other_str =&gt; true or false “hello”.include? “lo” #=&gt; true “hello”.include? “ol” #=&gt; false “hello”.include? ?h #=&gt; true 3.字符串插入 ...

    Ruby中实现把字符串转换为类的2种方法

    最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 “ChinaMag”,根据这个字符串调用 类 ChinaMag下的方法。 解决办法: 1.rails可以使用 constantize方法。 代码如下: pry(main)&gt; ...

    RubyonRails字符串处理中文最新版本

    本文档旨在探讨Ruby on Rails中的字符串处理技术。在Ruby语言中,字符串可以通过多种方式创建。具体而言,字符串可以通过单引号('str')或双引号("str")来定义。这两种表示方式的主要区别在于它们对字符串内部...

    用string拆分字符串

    在编程领域,字符串(String)是数据处理的基本元素之一,经常需要进行拆分操作。当我们处理包含多个信息片段的字符串时,比如以特定分隔符连接的数据,就需要使用字符串的拆分方法来获取各个部分。本篇文章将深入探讨...

    字符串压缩

    文件名`zlib.rb`可能包含一个使用Ruby的`zlib`库进行字符串压缩和解压缩的示例代码。`zlib`库提供了对DEFLATE压缩算法的封装,它广泛应用于GZIP和ZIP文件格式。以下是使用`zlib`库进行压缩和解压缩的基本操作: ```...

    多行字符串的表示方式

    在编程领域,尤其是在Ruby语言中,处理多行字符串是一个常见的需求。标题“多行字符串的表示方式”聚焦于如何在代码中优雅地表示跨越多行的文本。Ruby提供了多种方法来处理这样的情况,使得代码更加易读且维护性更强...

    分割字符串函数 分割字符串函数

    在编程领域,分割字符串函数是处理文本数据时非常常用的一种工具。它允许我们将一个长字符串按照特定的分隔符拆分成多个子字符串,方便我们进行后续的分析、处理或存储。这里,我们将深入探讨字符串分割函数的相关...

    使用Ruby来处理文本的教程

    在文本处理领域,Ruby的表现尤为出色,它提供了一系列功能强大的字符串操作方法,使得处理文本数据变得简单高效。接下来,我们将详细探讨Ruby中字符串的操作方法,以及如何利用Ruby处理不同格式的文本数据,例如CSV...

    字符串和时间戳相互转换

    1. Python中的字符串与时间戳转换: - `strptime()` 函数用于将字符串按照指定的格式转换为时间对象。 ```python from datetime import datetime date_string = "2023-03-15 10:30:00" format = "%Y-%m-%d %H:%...

    各种语言的字符串逆序 Python、JavaScript、Java、C#、C++、Ruby、PHP、Go和Rust等语言

    实用性:字符串逆序是一个实用的操作,常用于各种编程任务。 扩展性:读者可以根据示例代码,进一步探索字符串的其他操作。 环境要求:部分语言的代码示例可能需要特定环境或编译器才能运行。 通过本教程,读者将...

    模糊字符串匹配:ruby的模糊字符串匹配库

    Fuzzy-string-match是用于ruby的模糊字符串匹配库。 很快(用RubyInline用C编写) 它仅支持Jaro-Winkler距离算法。 该程序是从Lucene 3.0.2手动移植的。 (lucene是Java产品) 如果要添加其他字符串距离算法,...

Global site tag (gtag.js) - Google Analytics