Ruby中符号是否属于其声明所在类的作用域?
核心结论:Ruby 中的符号默认是全局唯一的,但你完全可以在程序任意位置重复使用同名符号,不会和其他上下文的使用产生冲突。
你提到的“符号仅可被声明和写入一次”,指的是符号的不可变特性与对象唯一性规则:整个程序运行周期内,所有字面量写法的:name本质上都指向内存中的同一个符号对象,系统不会重复创建新的同名符号实例。但这一规则完全不会限制你在其他场景使用该符号,符号本身不存在类作用域隔离的限制。
你完全可以在其他类中同样使用:name定义访问器,不会和Person类的逻辑产生任何冲突,示例如下:
class Person attr_accessor :name end class Animal attr_accessor :name end person = Person.new person.name = "Dennis" cat = Animal.new cat.name = "Mimi" puts person.name # => "Dennis" puts cat.name # => "Mimi"
两个类的name访问器独立运行互不干扰,只是它们都使用了同一个:name作为方法名的标识而已。
这个特性也是符号的核心优势:因为全局唯一、不可变,用作方法名标识、哈希键时的性能远高于字符串,也能避免字符串拼写不一致带来的隐性bug。
内容的提问来源于stack exchange,提问作者Drew
相关产品推荐
相关产品推荐

