还记得第一次看到attr_accessor :cat 其实等于
def cat @cat #宣告了一个@cat的实体变数 end def cat= (cat) @cat = cat #把@cat = cat这个参数 end
再次的见识到ruby的强大啊!
一行抵六行!
等等...那个cat= (cat) 等于不把它分开吗?
答案是不行!!
当下真的是满脸黑人问号
在了解之前要先有个观念
在ruby里面其实『方法可以覆写』!
class Cat@count = 0 def self.new(*) @count += 1 super endend
在这例子里面偷偷的把new方法偷偷的覆写掉了
导致每次执行Cat.new的时候@count都会+1
ruby在跑程式码的时候会先看自己的class有没有实作method
没有的话就往上找,有的话就用自己的( new
到这里就有点了解为什么上面的cat= 不能分开了吧?!
其实他在偷偷做一些事情
让我们实际做一次
class Animal def cat @cat end def cat= (cat) @cat = catendenddoraemon = Animal.newp doraemon.cat = 3 #3
不要=了,改成cat会怎样呢?
class Animal def cat @cat end def cat (cat) @cat = catendend doraemon = Animal.new p doraemon.cat = 3 #会出现undefined method `cat='
其实当你在doraemon.cat = 3 的时候
看起来像是在做赋值的动作
其实是在呼叫『cat= (cat)』这个 method,并且把『3』这个参数丢给他
再回来主题
其实 attr_reader 在做这件事
def cat @cat #宣告@这个实体变数的存在 end
attr_writer 则是
def cat= (cat) @cat = cat #有赋值的功能 end
attr_accessor则是reader跟writer兼具
至于什么时候该用哪个就要看你的程式要做什么功能了