8779


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]


CC BY-SA 3.0
2015-04-04T16:25:50.413
8767
2015-04-19T06:32:49.497
2015-04-05T17:47:16.300
4114
8475
question
ruby
Rubyで無駄な変数を減らしたい


custom_push の細かい仕様が不明ですが、  
下記のコードはどうでしょうか？

[code]

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

後置の if はとても ruby らしいと思います


CC BY-SA 3.0
2015-04-05T02:24:18.503
8773
2015-04-05T02:29:52.960
2015-04-05T02:29:52.960
8870
8870
8767
answer


`#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]


CC BY-SA 3.0
2015-04-05T02:48:07.747
8776
2015-04-05T02:48:07.747
5793
8767
answer


`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)

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


CC BY-SA 3.0
2015-04-05T05:29:37.540
8779
2015-04-05T09:09:39.060
2015-04-05T09:09:39.060
85
85
8767
answer


冪等などはあまり詳しくないのですが、自分であればこうします。

[code]

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


CC BY-SA 3.0
2015-04-07T06:29:03.030
8856
2015-04-07T06:29:03.030
8558
8767
answer


`arr`メソッドが何度呼び出しても結果が変わらず、  
特にメモリに制限がないなら、何度もよべば良いのではないでしょうか。

[code]

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


CC BY-SA 3.0
2015-04-19T06:28:09.260
9303
2015-04-19T06:28:09.260
2599
8767
answer


`custom_push`メソッドは、`arr`の戻り値の配列の状態を変更するメソッドに見えるので、  
`arr`の戻り値の配列自身に`cutsom_push`メソッドを定義し、  
それを呼び出すといいのではないでしょうか。

[code]

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


CC BY-SA 3.0
2015-04-19T06:32:49.497
9304
2015-04-19T06:32:49.497
2599
8767
answer