You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问传入另一类构造方法的类实例的属性(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:06:03