如何访问传入另一类构造方法的类实例的属性(Ruby场景)
问题原因
你遇到的问题是Ruby中「类实例变量」和「对象实例变量」的作用域混淆导致的,核心差异如下:
- 在
FooClass的类定义顶层(不在任何实例方法内部)书写的@number = 3,对应的是FooClass这个类本身的实例变量:因为Ruby中所有类都是Class类的实例,这个@number属于类对象FooClass,只能被类本身访问,FooClass的普通实例无法读取。 attr_accessor :number生成的读写方法,是给FooClass的实例对象用的,只能读写每个实例自己的@number变量,和类对象的@number是完全独立的两个变量,没有关联。
所以你初始化FooClass.new的时候,生成的实例对象自己的@number从来没有被赋值过,默认就是nil,输出自然为空。
修复方案
方案1:在实例初始化方法中赋值(最常用)
如果要给每个FooClass实例的number设置默认值3,把赋值逻辑放到initialize实例方法中即可:
class TestClass def initialize(foo_class) puts foo_class.number end end class FooClass attr_accessor :number def initialize # 实例方法内部的@变量,绑定到当前生成的实例对象 @number = 3 end end foo_class = FooClass.new test_class = TestClass.new(foo_class) # 输出3
方案2:使用类变量共享值
如果希望所有FooClass实例共享同一个number值,可以用Ruby的类变量@@:
class FooClass @@number = 3 # 类变量,所有实例共享 # 手动定义实例的读取方法,读取类变量 def number @@number end end
.NET背景补充类比
可以对应到你熟悉的.NET概念方便理解:
- Ruby 实例方法内的
@变量 ≈ C#类的实例字段 - Ruby 类定义顶层的
@变量(类实例变量)≈ C#中Type类型实例的扩展字段,日常开发很少用到 - Ruby 类变量
@@≈ C#类的静态字段
内容的提问来源于stack exchange,提问作者Tarta
相关产品推荐
相关产品推荐

