如图,这是我看的一个 railscast-china 的视频,登陆验证一节,请问下为什么 password 和 password=方法会自动调用?password=是一个加密方法。 作者在 rails console 中 User.new(:name, :pass),得到的用法就是自动加密的,为何会调用 password=? 加 self 后应该是成为类方法,java 中的静态方法。这样的说法没错吧!那么不加 self 是叫做对象方法吗?
加self后应该是成为类方法,java中的静态方法。这样的说法没错吧!
对的,是类方法,叫 "class method" 为好。
那么不加self是叫做对象方法吗?
如果一定要说对象方法,那么他是 a = A.new 中的 a 对象。但是在 ruby 里,请叫它实例,instance。
看看 这本书能帮助理解。实例变量,类变量和类实例变量的区别......
#1 楼 @liwei78 谢谢,再请教下,图中的方法除了那个 class method 外,其他都没有显式调用; 字段是 login,hashed_password, salt; 添加 user 时作者这样写的 User.create(:login=>"yang", :password=>"111"), 实在看不出;哪里有调用方法 password=(pass)
#2 楼 @ruohanc 谢谢,你提醒了我,我正好买得有,只是以前没看懂。。。。。。
User.create(:login=>"yang", :password=>"111") 这里 password 和 password=() 就是常见的对属性做 get 和 set。 create 方法可以拆解为
user = User.new user.login = 'a' user.password = 'a' user.save
具体见 create 的代码
# File activeresource/lib/active_resource/base.rb, line 745 def create(attributes = {}) self.new(attributes).tap { |resource| resource.save } end
class Some class << self def create ...
这时 create 是类方法,省掉了 self。
#3 楼 @flowerwrong 应该是在 create 方法调用的,参数里有 password,会处理到。 rails 有隐含方式的调用,确实容易困惑。
thx all, 我还是喜欢显式调用,@user.password = User.hash_password(pass, salt), def self.hash(pass, salt) end in UserModel.
然后经过查资料,发现有三种方法创建 class method 一.@6 楼的 二. def self.method_name end 三. class some; end def some.method_name end
def self.method_name end
class some; end
def some.method_name end
同意二楼,看了 Ruby 元编程 之后一下就对 Ruby 里面这些方法调用是怎么运行的有个清晰的认识
#9 楼 @flowerwrong 还有种比较挫的
class Some def Some.method_name end end