新手问题 attributes 和 self 的区别问题

suyuhang · 2014年04月27日 · 最后由 neverlandxy_naix 回复于 2014年04月28日 · 2978 次阅读

最近我一直苦恼一个问题,当我建立了一个 model 的时候,写了一个 api

然后我通过定义类

class Comic < ActiveRecord::Base

attr_accessible :name

def name self.name 或者写成 attributes['name'] end

def as_json(options={}) super(:methods => [:name]) end

end

疑问: 1.我有一个疑问,self 是当前的 class,self.name 和 attributes['name'] 的区别是什么?

我知道 attributes 这么访问属性是一个 hash

但是我比较纠结的是 每一个类 都是一个 hash 嚒?

2.而且我在 method name 中对 name 属性 进行 URI:escape() 时候,却发现,URI:escape(self.name) 报错,而 URI:escape(arrtibutes['name']) 却可以顺利进行。

3.attributes 就是 attributes_accessoror 包括 seter&geter 方法, 那 attributes 也算是一个 hash,所以他在拿类的属性时候,attributes['key'] 嚒? 那我能理解为,attributes['key'] 就是调用 getter 方法,就像 java 中的对象.get 方法得到值吗? self 表示当前的类,那为什么当我进行属性编码的时候,self.属性值 却不行,然而 attributes[‘属性值’]却可以?

我是个新手 我想问问 这块应该仔细的看哪里。

def 是一个 作用域门, self.name 或者 attributes['name'] 中,self都是当前调用这个方法的时候的那个调用者,从这个类来看,是Comic的一个实例对象

URI:escape(self.name), 又循环调用了name方法,必然会报错,而(arrtibutes['name']只是取出了当前对象的属性

attributes不是attr_accessor之类的 类宏, 它就是一个实例方法,attributes['key']只是隐性调用了这个方法 (省略了self关键字,其实是self.attributes)

建议看一些 Ruby 的基础书,弄懂 self , 新手直接上 Rails 代码会晕掉的

#2 楼 @neverlandxy_naix 恩恩,您写的很详细,最近我一直在看 ruby 的基础书,programming ruby

#2 楼 @neverlandxy_naix 我昨天也看了看书,大概意思是,当属性 self.name 在 name 方法中被调用,程序会认为是递归方法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号