尝试了解在Ruby中使用self.method_name对Classname.method_name

前端之家收集整理的这篇文章主要介绍了尝试了解在Ruby中使用self.method_name对Classname.method_name前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图了解何时使用self.method_name和何时使用Classname.method_name.

在下面的例子中,为什么“before_create”需要引用“User.hash_password”而不是“self.hash_password”或“hash_password”?

由于我们已经在User类中,我认为before_create方法会“知道”,“hash_password”是其自己的类的成员,不需要任何特殊的语法来引用它.

require 'digest/sha1'

class User < ActiveRecord::Base

  attr_accessor :password
  attr_accessible :name,:password

  validates_presence_of :name,:password
  validates_uniqueness_of :name

  def before_create
    self.hashed_password = User.hash_password(self.password)
  end

  def after_create
    @password = nil
  end

  def self.login(name,password)
    hashed_password = hash_password(password || "")
    self.find(:first,:conditions => ["name = ? and hashed_password = ?",name,hashed_password])
  end

  def try_to_login
    User.login(self.name,self.password)
  end

  private

  def self.hash_password(password)
    Digest::SHA1.hexdigest(password)
  end

end

解决方法

def before_create
   self.hashed_password = User.hash_password(self.password)
end

在此示例中,User.hash_password调用User类的hash_password方法,而self.hashed_pa​​ssword =调用User的特定实例上的hashed_pa​​ssword =方法.

如果将User.hash_password替换为self.hash_password,则Ruby将抱怨NoMethodError,因为在User类中不存在名称为hash_password的实例方法.你可以用self.class.hash_password替换它.

如果用简单的hashed_pa​​ssword =替换self.hashed_pa​​ssword =,Ruby将创建一个名为hashed_pa​​ssword的本地变量,而不是调用实例方法hashed_pa​​ssword =.如果要调用属性编写器,则需要显式添加自身.

方法定义中的self(def self.hash_password)使hash_password成为一种类方法,而不是实例方法.在这种情况下,自我指的是类.在实例方法的上下文中,self指的是一个实例.

猜你在找的Ruby相关文章