ruby新手入门随手记 attr_reader 、 attr_writer 、 attr_accessor有什么差别?

还记得第一次看到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兼具

至于什么时候该用哪个就要看你的程式要做什么功能了


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章