用ruby的朋友都知道,给方法传参数的时候可以不用括号。
ex:
ruby中定义类似java中的get/set方法这样写
这样问题就产生了,
如果我在一个方法中像下面这样写,
那么这是在调用一个方法呢?还是给一个局部变量赋值?
肯定的告诉你,这是一个局部变量的赋值。
要想调用name=方法的话,加上self
rails中是这样规定的
1 在赋值的时候
如果不使用self,类似name = xxx,被认为局部变量声明
使用self,比如self.name = xxx,被认为是调用name=方法
2 在取值的时候
如果不使用self,那么 name ,被认为是访问局部变量,如果找不到这个名字的局部变量,依然去调用这个名字对应的方法
如果使用self,那么 self.name是调用name方法
有rails源码为证(ActiveRcord::Base中的attributes和attributes=方法,别说你没用过。。。)
这里的#8,#9,#11,#12等行的attributes都是局部变量。
再看另一个方法
#10行,第一个self.attributes是调用了attributes=方法,
第二个attributes则是局部变量
所以在rails的模型类中,可以省略self的地方尽量省略来写,
只有在调用方法的时候才使用self.xxx 。。。
这样使得模型类看起来方便些,不会满眼都是self。
原文地址:http://blog.csdn.net/zhao_hongsheng/archive/2011/05/12/6415686.aspx