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 提供丰富的字符串方法,以下是常用的:
- 长度:
length
或size
返回字符数。
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 的字符串功能丰富,支持插值、正则表达式、多字节编码等,方法多样且灵活。常用方法如 split
、gsub
、strip
等简化文本处理,而 freeze
和编码处理则优化性能和国际化支持。理解字符串的 mutable 特性和符号的区别,有助于编写高效代码。
如果你有具体问题或需要更详细的示例,请告诉我!