加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:18:40 所属栏目:百科 来源:网络整理
导读:我试图了解何时使用self.method_name和何时使用Classname.method_name. 在下面的例子中,为什么“before_create”需要引用“User.hash_password”而不是“self.hash_password”或“hash_password”? 由于我们已经在User类中,我认为before_create方法会“知道
我试图了解何时使用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指的是一个实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读