0

私は、Michael Hartl による RoR チュートリアルに取り組んでいます。SessionsHelper のコードを次に示します。

module SessionsHelper                                                       
  def sign_in(user)                                                         
    cookies.permanent[:remember_token] = user.remember_token                
    self.current_user = user                                                
  end                                                                       

  def current_user=(user)                                                   
    @current_user = user                                                    
  end                                                                       

  def current_user                                                          
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
  end                                                                       

  def current_user?(user)                                                   
    user == current_user                                                    
  end                                                                       

  def signed_in?                                                            
    !current_user.nil?                                                      
  end                                                                       

  def sign_out                                                              
    self.current_user = nil                                                 
    cookies.delete(:remember_token)                                         
  end                                                                       

end   

このコードから理解できないことがいくつかあります。

  • メソッドcurrent_user?ではcurrent_user、変数ですか、それともメソッドの呼び出しcurrent_userですか?

current_userこのコンテキストでの値を決定する方法がわかりません。

  • メソッドcurrent_user@current_userは、 はインスタンス変数です。それは何のインスタンス変数ですか (つまり、どのクラスですか?)?

sign_in(user)メソッドの下を見るself.current_userと、 object の値が割り当てられていることがわかりますuserUsersController < ApplicationControllerしかし (の定義にApplicationControllerを含む行があるため、 self がクラス UsersController であると仮定すると) 、オブジェクトSessionsHelperのインスタンス変数の定義はありません。current_userself

  • なぜ私たちはcurrent_user=を使用する@current_userのにを使用するのでしょうか?current_user?current_user

StackOverflow で前提条件の検索を行いましたが、これらすべての違いについて適切な説明が見つかりませんでした。私が学ぼうとしていることの大部分は@current_user、 , current_user,をいつ使うかということです:current_user。私は C、C++、PHP、Java、JavaScript に最も精通しています。これらの言語に類似する言語があれば、何が起こっているのかをよりよく理解するのに役立ちます.

4

3 に答える 3

2

current_user? メソッドでは、current_user は変数ですか、それとも current_user メソッドの呼び出しですか?

スコープ内にその名前のレキシカルがないため、これはメソッドです。

メソッド current_user では、@current_user はインスタンス変数です。それは何のインスタンス変数ですか (つまり、どのクラスですか?)?

SessionsHelperこれは、混合モジュール(通常は)を持つ任意のクラスのインスタンスのインスタンス変数ですinclude SessionsHelper

sign_in(user) メソッドの下を見ると、self.current_user にオブジェクト user の値が割り当てられていることがわかります。ただし (UsersController < ApplicationController であり、ApplicationController の定義に SessionsHelper を含む行があるため、self がクラス UsersController であると仮定すると)、self オブジェクトのインスタンス変数 current_user の定義はありません。

sign_inは、setter メソッドとともにこのモジュールで定義されますcurrent_user=。は引数付きself.current_user = userのメッセージを に送信します。sign_in はこのモジュールから来たので、このモジュールで定義されたセッターにメッセージディスパッチが行く可能性はかなり高いですが、同じ名前のセッターがこのモジュールを含むクラスまたはモジュールによって定義される可能性は確かにあります。このモジュールの後に含まれます。この場合、これらのメソッドはディスパッチ検索で最初に見つかります。:current_user=userself

current_user= で @current_user を使用しているのに、current_user ではどうですか? current_user を使用するだけですか?

インスタンス変数が定義されている場合は、setter メソッドと getter メソッド (および場合によっては初期化) への直接のインスタンス変数アクセスを制限することをお勧めします。この場合、述語でcurrent_usergetter を再利用することにより、getter 内の式current_user?のキャッシュまたはフェッチ動作を保持し@current_user ||= User.find_by...ます。

于 2012-10-12T05:07:57.140 に答える
2

他の回答を補足するために:

メソッドcurrent_user@current_userは、 はインスタンス変数です。それは何のインスタンス変数ですか (つまり、どのクラスですか?)?

インスタンス変数はクラスに属しません。それらはインスタンスに属しているため、インスタンス変数と呼ばれます。それらは常に に属しselfます。つまり、メッセージの受信者がどちらのオブジェクトであるかに関係ありません。

インスタンス変数は魔法のように存在し、最初に割り当てられると、どこにも宣言されません。

于 2012-10-12T08:38:47.007 に答える
1

これは、カプセル化と呼ばれるオブジェクト指向プログラミングの基本概念です。変数@current_userがありますが、変数を直接使用していません。getter および setter と呼ばれるメソッドを介して使用します。変数の値を取得するためのゲッターと、変数の値を設定するためのセッターです。

この場合、ゲッター メソッドはcurrent_userであり、セッター メソッドはcurrent_user=です。getter と setter の内部でのみ、変数@current_userを直接使用します。これらのメソッドの外では、常にメソッド呼び出しを使用します。

于 2012-10-12T05:09:27.793 に答える