class C
def foo
@foo
end
def foo=( v )
@foo = v
end
end
c = C.new
c.foo = 5 # 变成 c.foo=( 5 )
p c.foo
显示结果是:5
如果,把def foo=( v );@foo = v;end删除
显示:NoMethodError错误(
发表于 2014-10-12 10:51
class C
def foo
@foo
end
def foo=( v ) @foo = v
end
end
c = C.new
c.foo = 5 # 变成 c.foo=( 5 )
p c.foo
我把def foo=( v );@foo = v;end删除了
结果显示:undefind method "foo=" for #<C:0x10c6d90>
1.类方法/类方法简单来说就是可以用类名直接调用,也可以用对象名调用,所以可以认为,类变量是这个类的全体对象所拥有的变量;而(普通)方法/(普通)属性只能通过对象名调用,可以认为普通属性因对象而异。
[pre lang="Ruby"]class A
@@aa = 0 #定义类变量aa
attr_accessor :a #定义实例变量a
def initialize(a)
@a = a
end
def aa
return @@aa
end
def aa=(val)
@@aa = val
end
def self.aa
return @@aa
end
def self.aa=(val)
@@aa = val
end
end
a1 = A.new(1)
a2 = A.new(2)
a1.aa = 3
p a1.a #=> 1
p a2.a #=> 2
p a1.aa #=>3
p a2.aa #=>3
A.aa = 4
p a1.aa #=>4
p a2.aa #=>4
p A.aa #=>4[/pre]
注意观察以上结果,了解类变量和实例变量的区别。注意,如果要让类和类的实例均可访问类变量@@aa,需要定义两组方法,原因略。
3.undefind method "foo=" for #<C:0x10c6d90>,这句话的意思就是类C的一个对象没有定义'foo='方法,后面的<C:0xxxxx#>,前面的C表示对象所属类别,后面的0x表示对象的内存地址(其实告诉你内存地址对你的帮助不大)。这句话主要是告诉你,你的脚本有错,错误在于你对C类的对象调用了一个没有的方法。原因很简单,你删去了def foo=(v)那一段,才引发此Error