Rails ruby 中的类方法与对象方法有什么区别???求解

flowerwrong · 2014年05月27日 · 最后由 sunday35034 回复于 2014年05月28日 · 2584 次阅读

如图,这是我看的一个 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

同意二楼,看了 Ruby 元编程 之后一下就对 Ruby 里面这些方法调用是怎么运行的有个清晰的认识

#9 楼 @flowerwrong 还有种比较挫的

class Some
  def Some.method_name
  end
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号