Rubyで無駄な変数を減らしたい


Rubyぽくないコードを書いてしまったのですが、もっとRubyぽいコードは書けないでしょうか。

それぞれのメソッドの仕様：

  * _arr_ メソッドは配列を返却し、 _custom_push_ メソッドはそれを受け取ります。
  * 最後の要素が4より大きければ、999を配列に挿入する。そうでなければ、そのまま返します。

メソッドの仕様は変えられないのですが、Rubyの良さをより強調できる _custom_push_ メソッドの実装にはどのようなものが考えられるでしょうか。

[code]

    def arr
      [1,2,4] # ケース１
      [1,2,9] # ケース２
    end
    
    def custom_push
      a = arr
      if a.last > 4 then
        a << 999   
      end
      a
    end
    
[/code]




`tap`を使うとRubyならでは、っていう感じがしますね。

[code]

    def custom_push
      arr.tap do |a|
        a << 999 if a.last > 4
      end
    end
    
[/code]

いかがでしょうか？

あと、Rubyっぽいコードに関しては以前僕が書いたこちらの記事が役に立つかもしれません。

[[初心者向け]
RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](http://qiita.com/jnchito/items/dedb3b889ab226933ccf)

こちらもあわせてどうぞ。




`#arr`の性質(冪等なのか否か、コストがどれぐらいなのか)が明らかではないので、変数`a`は必要です。とすると`if`を後置`if`に書き換えるぐらいしかありません。

[code]

    def custom_push
      a = arr
      a << 999 if a.last > 4
      a
    end
    
[/code]

無理に縮められなくも無いですが…

[code]

    def custom_push
      a = arr
      (a << 999 if a.last > 4) || a
    end
    
    def custom_push
      a = arr
      a.last > 4 ? a << 999 : a
    end
    
    def custom_push
      (a = arr).last > 4 ? a << 999 : a
    end
    
[/code]

