1

Rubyを学び始めたとき、MichaelHartlの優れたRailsチュートリアルから始めました。チュートリアルをもう一度見てみると、サンプルアプリケーションコードの一部が変更されていることに気づきました。認証の章では、2つの方法が変更されました。

# SessionsHelper
def sign_in(user)
  ...
  self.current_user = user
end

def sign_out
  self.current_user = nil
  ...
end

以前は、キーワードselfは省略されていました。しかし、アプリは機能しました。それで、それが壊れていないのなら、なぜそれを修正するのですか?どのような付加価値がselfあり、なぜそれが使用されるのですか?

selfインスタンスメソッドではなくクラスメソッドを定義していることを理解しています。また、モデルでは、を使用selfすると、オブジェクトのプロパティを直接参照できます。しかし、ドットを結び付けて、ヘルパーでどのように使用されているかを確認することはできません。以前にコントローラーで見たことがありますが、なぜそこで使用したいのか理解できません。

4

2 に答える 2

4

[編集]

チュートリアルの元のセクションがまったく間違っていた可能性があります。「自己」レシーバーを省略すると、メソッドはメソッドローカル変数「current_user」に値を割り当てますが、他の効果はありません。

以下の私の元の答えは正しくないため、無視する必要があります(foo=(x)他のメソッドと同様に、ライターメソッドはレシーバーなしでは呼び出せないため)。

[以下の誤った元の回答]

「自己」受信機を使用する理由は、明確にするためである可能性があります。

「self」を省略した場合、訓練を受けていない人には、「user」変数を「current_user」という名前の新しい変数に割り当てているだけで、他の効果はないように見えます。経験豊富なRubyistは、オブジェクトインスタンスに「current_user」という名前のメソッドがある場合、新しい変数を作成して割り当てる代わりに呼び出されることを知っていますが、この詳細は、特にメソッドが継承されているか、宣言されていない場合は、簡単に見落とされる可能性があります。現在のクラス定義セクション。

「self」キーワードを明示的に使用することにより、このオブジェクトインスタンスでメソッドを呼び出していることを明確に示しています。

于 2012-10-02T14:11:57.397 に答える
1
class User
  attr_accessor :current_user

  def sign_in_1
    # Assigning local variable here
    current_user = "Foo"
  end

  def sign_in_2
    # Calling accessor method
    self.current_user = "Bar"
  end
end

u = User.new
u.sign_in_1
p u.current_user #=> nil
u.sign_in_2
p u.current_user #=> "Bar"
于 2012-10-02T14:36:38.073 に答える