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 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效