14696

[code]

    arr = ["foo", "bar"].map{ |s| s.upcase }
    
[/code]

このコードは以下のように短縮できます。

[code]

    arr = ["foo", "bar"].map(&:upcase)
    
[/code]

* * *

では、

[code]

    arr2 = ["foo", "bar"].map{ |s| my_method(s) }
    
[/code]

このようなコードを短縮して書く方法はありますか？  
ない場合、そもそもこの書き方自体がruby的でないとかそういう事情があるのでしょうか？  
(ダックタイピングするなり、該当クラスを継承した自分用クラスを作るなりしてs.my_methodの形にしたほうが良い？)


CC BY-SA 3.0
2015-08-21T02:25:29.183
14690
2015-08-21T06:31:33.557
2015-08-21T05:07:58.820
10685
10685
question
ruby
ブロック内で引数適用も省略して書ける？


以前Qiitaに書いたこの記事の内容と同じかもしれません。

[配列を順番に処理するとき、直接メソッドを呼ぶ代わりに"&method(:name)"を使う](http://qiita.com/jnchito/items/dedb3b889ab226933ccf#%E9%85%8D%E5%88%97%E3%82%92%E9%A0%86%E7%95%AA%E3%81%AB%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E7%9B%B4%E6%8E%A5%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%91%BC%E3%81%B6%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABmethodname%E3%82%92%E4%BD%BF%E3%81%86)

> 配列を順番に処理するとき、直接メソッドを呼ぶ代わりに"&method(:name)"を使う
>
> 普通にブロックを書く方が一般的ですが、&method(:name)みたいな引数を渡すこともできます。

### 普通に呼ぶ場合

[code]

    def process_users
      users.each do |user|
        process_user(user)
      end
    end
    
    def process_user(user)
      send_mail_to(user)
      user.mail_sent_at = Time.now
      user.save
    end
    
[/code]

### &method(:name)の形式で呼ぶ場合

[code]

    def process_users
      users.each(&method(:process_user))
    end
    
    def process_user(user)
      send_mail_to(user)
      user.mail_sent_at = Time.now
      user.save
    end
    
[/code]


CC BY-SA 3.0
2015-08-21T06:31:33.557
14696
2015-08-21T06:31:33.557
85
14690
answer