33644


メソッドの呼び出しをインスタンス変数が初期化されてないときにだけ行う方法として

[code]

    def foo
      @foo ||= foo_init
    end
    
[/code]

のような書き方がありますが、`foo`が引数を取る時はどのように書くのが良いでしょうか？  
現状は

[code]

    def initialize
      @foo = {}
    end
    
    def foo(arg)
      @foo[arg] ||= foo_init(arg)
    end
    
[/code]

または

[code]

    def foo(arg)
      @foo = {} if foo.nil?
      @foo[arg] ||= foo_init(arg)
    end
    
[/code]

としていますがもっと良い書き方はあるでしょうか？


CC BY-SA 3.0
2017-01-10T13:00:09.203
31754
2017-03-29T21:53:33.680
2017-02-27T01:41:03.310
2599
3271
question
ruby
メソッドの呼び出しをインスタンス変数が nil の場合に行う時の引数のとり方


あえて1行で書くなら下記のように書けます。

[code]

    def foo(arg)
      (@foo ||= {})[arg] ||= foo_init(arg)
    end
    
[/code]

では、このコードがわかりやすいかと言われると、全くそうとは思えません。変な工夫はせずに、2行にした方が良いでしょう。

[code]

    def foo(arg)
      @foo ||= {}
      @foo[arg] ||= foo_init(arg)
    end
    
[/code]

もうひとつは、`@foo`と直接インスタンス変数を見に行かずに、常にメソッド経由で取得するという物です。

[code]

    def foo_hash
      @foo ||= {}
    end
    
    def foo(arg)
      foo_hash[arg] ||= foo_init(arg)
    end
    
[/code]

`foo_hash`呼び出しの度に`||=`の処理が入ることでちょっと遅くなりますので、頻繁に呼び出す場合は注意が必要です。ただ、速度を気にするのであれば、`initialize`で初期化しておいた方が良いでしょう。


CC BY-SA 3.0
2017-03-29T21:53:33.680
33644
2017-03-29T21:53:33.680
7347
31754
answer