Ruby 字符串(String)

在 Ruby 中,字符串(String) 是一种表示文本的数据类型,广泛用于存储和操作字符序列。Ruby 的字符串功能强大且灵活,支持多种操作、插值和编码处理。以下是对 Ruby 字符串的中文讲解,涵盖创建、操作、方法等关键内容,力求简洁清晰。


1. 创建字符串

字符串可以通过单引号 ' 或双引号 " 定义,也可以使用其他方式。

  • 单引号:简单字符串,不支持插值和转义(除 \\')。
  str = 'Hello, Ruby!'
  puts str  # 输出:Hello, Ruby!
  • 双引号:支持插值(#{})和更多转义字符(如 \n)。
  name = "Alice"
  str = "Hello, #{name}!\nWelcome"
  puts str
  # 输出:
  # Hello, Alice!
  # Welcome
  • % 符号:替代引号,适合多行或特殊字符。
  str = %Q(Hello, "Ruby"!)  # 等价于双引号
  puts str  # 输出:Hello, "Ruby"!
  str2 = %q(Hello, Ruby!)   # 等价于单引号
  • Here Document (HEREDOC):多行字符串。
  str = <<~TEXT
    Hello,
    This is Ruby!
  TEXT
  puts str
  # 输出:
  # Hello,
  # This is Ruby!

2. 字符串插值

双引号字符串支持 #{} 插值,允许嵌入表达式。

age = 25
str = "I am #{age} years old."
puts str  # 输出:I am 25 years old.

说明:单引号不支持插值,#{age} 会原样输出。


3. 常见字符串方法

Ruby 提供丰富的字符串方法,以下是常用的:

  • 长度lengthsize 返回字符数。
  str = "Ruby"
  puts str.length  # 输出:4
  • 大小写转换
  str = "Hello"
  puts str.upcase   # 输出:HELLO
  puts str.downcase # 输出:hello
  puts str.capitalize  # 输出:Hello(首字母大写,其余小写)
  • 修剪strip 去除首尾空白,lstrip/rstrip 去除左/右空白。
  str = "  Ruby  "
  puts str.strip  # 输出:Ruby
  • 分割与连接
  str = "a,b,c"
  array = str.split(",")  # 输出:["a", "b", "c"]
  puts array.join("-")     # 输出:a-b-c
  • 查找与替换
  str = "Hello, Ruby!"
  puts str.include?("Ruby")  # 输出:true
  puts str.gsub("Ruby", "World")  # 输出:Hello, World!
  • 索引与截取
  str = "Hello"
  puts str[1]      # 输出:e
  puts str[1..3]   # 输出:ell
  puts str.slice(1, 3)  # 输出:ell
  • 修改方法:方法名带 ! 会修改原字符串。
  str = "hello"
  str.upcase!  # 修改原字符串
  puts str     # 输出:HELLO

4. 字符串编码

Ruby 支持多字节字符(如中文),默认编码为 UTF-8。

str = "你好,Ruby!"
puts str.length      # 输出:8(字符数)
puts str.bytesize    # 输出:14(字节数,中文占 3 字节/字符)
puts str.encoding    # 输出:UTF-8
  • 强制编码encode 转换编码。
  str = "Hello".encode("ASCII")
  • 检查编码valid_encoding? 检查字符串是否有效。
  str = "Hello".force_encoding("UTF-8")
  puts str.valid_encoding?  # 输出:true

5. 字符串连接

  • + 运算符:创建新字符串。
  str1 = "Hello, "
  str2 = "Ruby!"
  puts str1 + str2  # 输出:Hello, Ruby!
  • << 运算符:追加到原字符串,修改原对象。
  str = "Hello"
  str << ", Ruby!"
  puts str  # 输出:Hello, Ruby!
  • concat:类似 <<,可追加多个字符串。
  str = "Hello"
  str.concat(", ", "Ruby!")
  puts str  # 输出:Hello, Ruby!

6. 正则表达式与字符串

字符串支持正则表达式操作(如匹配、替换)。

str = "Hello, Ruby!"
puts str.match(/Ruby/)  # 输出:#<MatchData "Ruby">
puts str.gsub(/\w+/, '*')  # 输出:*, *!

7. 冻结字符串

Ruby 的字符串默认可变,可用 freeze 使其不可变,节省内存。

str = "Hello".freeze
# str << "!"  # 错误:Cannot modify frozen String

8. 字符串与符号

字符串和符号(Symbol)不同:

  • 字符串是可变对象,每次创建新实例。
  • 符号是不可变对象,内存中唯一。
str = "hello"
sym = :hello
puts str == sym.to_s  # 输出:true
puts str.object_id    # 每次不同
puts sym.object_id    # 始终相同

9. 注意事项

  • 性能:大量字符串操作时,优先用 <<concat 避免创建新对象。
  • 编码问题:处理多语言文本时,确保正确设置编码(如 UTF-8)。
  • 单引号 vs 双引号:单引号性能略高,适合无插值场景。
  • 方法后缀
  • !:修改原字符串(如 upcase!)。
  • ?:返回布尔值(如 empty?)。
  • 空字符串
  str = ""
  puts str.empty?  # 输出:true

10. 示例:综合应用

module StringUtils
  def reverse_words
    split.reverse.join(" ")
  end
end

class String
  include StringUtils
end

str = "Hello Ruby World"
puts str.reverse_words  # 输出:World Ruby Hello
puts str.upcase         # 输出:HELLO RUBY WORLD
puts str[6..9]          # 输出:Ruby

总结

Ruby 的字符串功能丰富,支持插值、正则表达式、多字节编码等,方法多样且灵活。常用方法如 splitgsubstrip 等简化文本处理,而 freeze 和编码处理则优化性能和国际化支持。理解字符串的 mutable 特性和符号的区别,有助于编写高效代码。

如果你有具体问题或需要更详细的示例,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注