15

使うべきかif defined?

 return @current_user_session if defined?(@current_user_session)
 @current_user_session = UserSession.find

または||=

@current_user_session ||= UserSession.find

if defined?最近、この方法がますます使用されていることに気付きました。どちらか一方に利点はありますか?個人的に||=は読みやすさ重視。memoizeまた、Rails には、この動作を透過的に提供するマクロが含まれている可能性があると思います。これは事実ですか?

4

3 に答える 3

26

注意: x ||= y は、x が false を返す場合、x = y を割り当てます。これは、x が未定義、nil、または false であることを意味する場合があります。

おそらく @current_user_session インスタンス変数のコンテキストではありませんが、変数が定義されて false になることが何度もあります。

簡潔にしたい場合は、条件付き構文を試してください。

defined?(@current_user_session) ?
    @current_user_session : @current_user_session = UserSession.find

あるいは単に:

defined?(@current_user_session) || @current_user_session = UserSession.find

変数を初期化する必要がある場合。

于 2009-06-08T08:28:25.947 に答える
1

Railsにはメモ化があります。優れた紹介については、以下のスクリーンキャストをチェックしてください。

http://railscasts.com/episodes/137-memoization

class Product < ActiveRecord::Base
  extend ActiveSupport::Memoizable

  belongs_to :category

  def filesize(num = 1)
    # some expensive operation
    sleep 2
    12345789 * num
  end

  memoize :filesize
end
于 2009-06-09T01:49:59.383 に答える
0

さらに、||=nice は (少なくとも 1.8.6 と 1.8.7 では) 初期化されていないインスタンス変数に関する警告を生成しますが、より詳細なdefined?バージョンは生成しません。

一方、これはおそらくあなたが望むことをします:

def initialize
  @foo = nil
end

def foo
  @foo ||= some_long_calculation_for_a_foo
end

しかし、これはほぼ確実にそうではありません:

def initialize
  @foo = nil
end

def foo
  return @foo if defined?(@foo)
  @foo = some_long_calculation_for_a_foo
end

なぜなら、常にその時点で定義されるからです@foo

于 2009-06-08T15:21:09.793 に答える