Symbol 深入
Symbol 不可变/唯一性、内存效率、作为 Hash 键、send/respond_to? 元编程
Symbol 深入
Symbol 是不可变的、唯一的字符串替代品——同一内容的 Symbol 在内存中只有一个实例。这是 Ruby 元编程和 Hash 键的基础。
学完本章你将: 掌握 Symbol 不可变/唯一性、send/respond_to?、元编程。
Symbol 特性
ruby
:name.object_id # 相同的 Symbol 共享同一对象
:name.object_id # 同一个 object_id
"name".object_id # 每次都是新对象
"name".object_id # 不同的 object_id
# 转换
:name.to_s # "name"
"name".to_sym # :name
"name".intern # :name(同 to_sym)
send —— 动态调用方法
ruby
class User
attr_accessor :name
def greet(prefix)
"#{prefix}, #{@name}!"
end
end
user = User.new
user.name = "小明"
# 静态调用
user.name # "小明"
# 动态调用——方法名可以是变量
method_name = :name
user.send(method_name) # "小明"
user.send(:greet, "Hello") # "Hello, 小明!"
# respond_to? 检查方法是否存在
user.respond_to?(:name) # true
Symbol vs String
ruby
# ✅ Symbol 用于:Hash 键、方法名、常量标识
# ✅ String 用于:用户数据、文本处理
# 内存效率
1000.times { :hello } # 只创建一个 Symbol
1000.times { "hello" } # 创建 1000 个 String