weixin_42361523 2010-03-27 13:44
浏览 222
已采纳

Ruby实例变量继承问题

本人新手,在看到以下代码是不太明白,望高手解惑:
类A的实例变量@i可以被类B继承吗?
网址http://www.iteye.com/wiki/Ruby_Hacking_Guide/1266-chapter-i-ruby-language-to-minimize#1409
代码

class A

def initialize() # 在new的过程中调用

@i = "ok"

end

end

class B < A

def print_i()

p(@i)

end

end

B.new().print_i() # 显示"ok"

  • 写回答

2条回答 默认 最新

  • qwe_rt 2010-03-27 15:19
    关注

    [quote]只有方法可以继承,只要调用继承方法(通过子类实例),就会发生实例变量赋值,也就是说,将它定义出来。[/quote]
    首先说明一下,上面我的理解是错误的。

    他这里理解为实例变量是不能被继承的。
    继承的只是方法。

    我们来分析一下他说的意思。

    既然方法可以被继承,那些继承后的B类变成如下这样的:
    [code="java"]
    class B < A
    def print_i()
    p(@i)
    end
    def initialize() # 在new的过程中调用
    @i = "ok"
    end
    end

    B.new().print_i() # 显示"ok"
    [/code]

    首先我们知道:[color=darkblue][size=medium]Ruby语言是一门动态语言,因此Ruby的实例变量无须声明,每个实例变量都是在第一次出现时动态加入对象。 [/size][/color]

    也就是说在new()对象B时,调用了initialize方法。在这个方法中遇到了“@i”,这时这个i动态的加入B对象,成为B对象的实例变量,所以B对象的所有方法可以访问这个i变量。

    应该说明白了吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊