

Ruby初心者です。

Rails tutorialの第9章まで進めています。  
以下のコードのrememberがなぜ、User.rememberにならないのかが疑問です。

class内部にあるメンバ関数は全て、User.(メンバ) もしくは、
self.(メンバ)と定義するべきと思っていたのですが、間違いなのでしょうか、また、間違いならば、なぜ間違いなのでしょうか。  
ご教授よろしくお願いします。

オブジェクト指向の理解ができていないと思っており、反省して勉強していますが、よくわからないです。

[code]

    リスト 9.3: rememberメソッドをUserモデルに追加する green
    
    class User < ApplicationRecord
      attr_accessor :remember_token
      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 }
    
      # 渡された文字列のハッシュ値を返す
      def User.digest(string)
        cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                      BCrypt::Engine.cost
        BCrypt::Password.create(string, cost: cost)
      end
    
      # ランダムなトークンを返す
      def User.new_token
        SecureRandom.urlsafe_base64
      end
    
      # 永続セッションのためにユーザーをデータベースに記憶する
      def remember   #｟memo｠User.rememberではないのはなぜ?
        self.remember_token = User.new_token
        update_attribute(:remember_digest, User.digest(remember_token))
      end
    end
    
[/code]


CC BY-SA 4.0
2018-10-12T01:34:30.297
49211
2020-07-25T07:58:40.413
30213
question
ruby-on-rails ruby
クラス内部のメンバ変数定義は全てselfをつけるとは限らないのでしょうか


【注意】下記回答にには少々難しい内容が含まれています。Ruby初心者のかたは今はあまり理解できないかも知れません。無理に理解せずに、後から読み直してみてください。

* * *

クラスメソッドを作成する場合は、`def クラス名.メソッド名`または`def
self.メソッド名`で定義します。対して、インスタンスメソッドを作成する場合は`def メソッド名`だけになります。

通常、Rubyのほとんどのメソッドはインスタンスメソッドです。なぜなら、インスタンスの無い状態(インスタンス変数に何が入っているか等)によってメソッドの動作を変えるからです。しかし、特定のインスタンスによらないメソッドを作りたい場合があります。その時に作るのがクラスメソッドです。クラスメソッドはインスタンスを作成しなくても呼び出せるというところがインスタンスメソッドと大きな違いです。

さて、Rubyにおいて、 **クラスメソッドはそのクラスの特異メソッド(特異クラスのインスタンスメソッド)です。** 特異メソッドは特異クラス`class
<< オブジェクト`内でインスタンスメソッドとして定義するか`def オブジェクト.メソッド名`で定義します。

`class
クラス名`内で、`クラス名`と書いた場合はそのクラスそのものオブジェクトをさします(Rubyではクラスもオブジェクトです)。また、その直下の文脈において、`self`もまたクラスそのもののオブジェクトをします。つまり、`def
クラス名.メソッド名`または`def
self.メソッド名`は、クラスそのものに対する特異メソッドを定義することになります。最初に言ったとおり、クラスの特異メソッドがクラスメソッドでした。ですので、この方法がクラスメソッドを作る方法になります。

他に`class << クラス名`や`class << self`内に書く方法もあります。詳しくは公式ドキュメントも参考にしてください。

参考: <https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#class_method>


CC BY-SA 4.0
2020-07-25T07:58:40.413
68944
2020-07-25T07:58:40.413
7347
49211
answer