先看标题,在看节点,大概也就有了点准备
class C
def hello
@v1 = "var v1 hello"
puts @v1 # 2,这里打印出 var v1 hello
puts @@v1 # 3 ,这里打印出 var v1 D
end
@v1 = "var v1"
@@v1 = "var v1 C"
puts @v1 # 1,这里打印出 var v1,这里应该没问题
end
class D < C
@@v1 = "var v1 D"
end
C.new.hello #
C.new.v1
C.v1
结果 1 处:应该没有什么问题;
结果 2 处:结果应该也没有什么没问题,但这里要特别注意的是,类的 实例变量 无法在类的 实例方法 中访问,也就是说如果在 C#hello 方法中不定义 @v1 = "var v1 hello"
也无法打印出 var v1
,再说深一点,类的不同对象所拥有的实例变量也不同,此例 C.new 这个对象所拥有的实例变量只有 hello 方法中的 @v1 ,如果此实例不调用 hello 方法,它连 @1 这个实例变量都没有;
结果 3 处:虽然再 C 类中定义了类变量 @@v1 = "var v1 C"
,但类变量可以在其子类访问修改,在 D 类中会将 其父类 C 的类变量 @@v1 重新定义为 @@v1 = "var v1 D"
,因为类 D 中的 @@v1 还是属于类 C 的共享类变量,因此再最后调用 puts @@v1
时会打印出 var v1 D ;
最后执行到 C.new.v1 时就会报错,后面 C.v1 也将同样报错。因为也很简单就是没有定义相关的实例方法与类方法。
一直想换个功能机,但因为有些情况又不得考虑,比如查看邮件,收发 QQ 群消息等。如果不用这些,最后损失的还是自己。所以一直换不过去
Ruby 是什么?能干什么?做什么的?怎么完全没听过?(成都某学校)
TW 招聘这么低调,成都的顶一下
在 Gemfile 中把 Rails 的版本号改为 4.2.0.rc1
现在纸质的 25
:plus1: 来赞一个
看到足球二字进来的。。
看评论……
面向“对象”(群众)编程
class A
@a=1
@@a=2
#类变量与类的实例变量类方法都可以访问
def self.class_method
p @a #=> 1
p @@a #=> 2
end
#类变量可以从实例方法访问, 类的实例变量不能
def instance_method
p @a #=> nil
p @@a #=> 2
end
end
#类变量子类可见,但类的实例变量子类不可见
class B < A
p @a #=> nil
p @@a #=> 2
end
A.class_method
A.new.instance_method
:plus1:
http://site:ruby-china.org 建议 ruby-china 添加站内搜索功能
正打算加入 go 圈
第一个结果 w1 对象继承拥有了 TimeStampingWriter Model 的 write_line 方法,当遇到 super("#{Time.new}: #{line} b")
时,会将括号内的值作为参数并调用类方法中 write_line,因此打印出 2014-11-03 17:00:19 +0800: hello b
第二个结果同样和第一个一样,仅仅是 super 内括号内的参数变化了而已。
第三个结果得出的过程就要复杂点了,按照执行顺序,write_line 方法的扩展顺序相当与 Class>TimeStampingWriter > NumberingWriter,也就是想执行 NumberingWriter 中的 write_line 方法,执行完后此时参数应为 "1: hello a" ,即为 line = "1: hello a"
然后再调用 TimeStampingWriter 中的 write_line,执行完后参数又变为 "2014-11-03 17:00:19 +0800: 1: hello a b", 即为 line = "2014-11-03 17:00:19 +0800: 1: hello a b"
,最后才调用 Class 中的 write_line 方法打印出结果。
很不错
#18 楼 @zj0713001 这样解释不对吧,你只看到后面的 = 号,怎么没看见前面的 = 号,如果说 = 号的优先级高,那么结果就是和 C 一样