Z
ZHANK
方法与块

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