Ruby on rails Railstutorial.org第8章:摘要方法定义

Ruby on rails Railstutorial.org第8章:摘要方法定义,ruby-on-rails,ruby,railstutorial.org,Ruby On Rails,Ruby,Railstutorial.org,我目前正在学习Michael Hartl的Rails教程,我发现了一个我不太了解的方法定义: class User < ActiveRecord::Base before_save { self.email = email.downcase } validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i v

我目前正在学习Michael Hartl的Rails教程,我发现了一个我不太了解的方法定义:

class User < ActiveRecord::Base


before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }

  # Returns the hash digest of the given string.
  def User.digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end
end
class用户
关键部分是定义
User.digest
。。。为什么他要写
def User.digest(string)
,而不仅仅是
def digest(string)


我们在用户类中,因此
用户应该可以访问其中的每个方法。
。那么,定义这样的方法不是多余的还是错误的吗?

以下是相互等效的类方法:

def User.digest(string)
  # MY LOGIC
end

def self.digest(string)
  # MY LOGIC
end
类方法直接在类上被调用,比如
User.digest(“my\u string”)

我们在用户类中,所以其中的每个方法都应该可以被用户访问

不幸的是,这不是真的。使用
User.
只能调用类方法

如果您已经定义了一个方法

def digest(string)
  # MY LOGIC
end
上面是一个实例方法,将在
用户
类的实例(对象)上被调用(不是直接在类上),如:


以下是相互等效的类方法

def User.digest(string)
  # MY LOGIC
end

def self.digest(string)
  # MY LOGIC
end
类方法直接在类上被调用,比如
User.digest(“my\u string”)

我们在用户类中,所以其中的每个方法都应该可以被用户访问

不幸的是,这不是真的。使用
User.
只能调用类方法

如果您已经定义了一个方法

def digest(string)
  # MY LOGIC
end
上面是一个实例方法,将在
用户
类的实例(对象)上被调用(不是直接在类上),如:

如果执行
def digest(string)
,则实际上是在定义一个实例方法

在此处阅读有关类和实例方法的更多信息:

Michael Hartl实际上解释了他为什么在底部以这种方式定义方法(第8.6节第1点)

…我们定义了新的令牌和摘要类方法,方法是在它们前面显式地加上User前缀。这很好用,因为它们实际上是使用User.new_令牌和User.digest调用的,所以这可能是定义它们的最清晰的方法

定义用户类方法的其他备选方法有:

def self.digest(string)
  #your code here
end

class如果执行
def digest(string)
,则实际上是在定义一个实例方法

在此处阅读有关类和实例方法的更多信息:

Michael Hartl实际上解释了他为什么在底部以这种方式定义方法(第8.6节第1点)

…我们定义了新的令牌和摘要类方法,方法是在它们前面显式地加上User前缀。这很好用,因为它们实际上是使用User.new_令牌和User.digest调用的,所以这可能是定义它们的最清晰的方法

定义用户类方法的其他备选方法有:

def self.digest(string)
  #your code here
end


class
def User.digest
≡ <代码>定义自我摘要
≡ <代码>类
def用户摘要
≡ <代码>定义自我摘要
≡ <这是一个非常好而且特别友好的回答:)谢谢你。。通常你在这里问这样一个基本的问题会觉得很愚蠢:这是一个非常好的、特别友好的回答:)谢谢。。通常你会觉得问这样一个基本的问题很愚蠢:D