コンテンツへ移動

Symbol#to_procは引数が指定できない

2012/3/3 18:46:35

というか、&による暗黙のto_procでは同上。なので、

[1,2,3].map{|x| x * 2}

的なことをしたいときには向かないんじゃないかな、と思うのです。そこでどうするか。

  1. Array#to_proc を作る
    class Array
      def to_proc
        unless first.is_a?(Symbol)
          raise ArgumentError, "first shuld be a Symbol"
        end
        proc {|o| o.send(*self)}
      end
    end
    p [1,2,3].map(&[:*, 2]) # => [2, 4, 6]
    

    的な。でも Array における to_proc というのは、あまりに直感的じゃない。[:method1, :method2] みたいな形でメソッドチェーンになるのが嬉しいかもしれないし、はたまた同じ形で [item.method1, item.method2] が返って来てほしいかもしれない。

  2. &:sym(*args) を許すようにパーサを書き換える。あと、Symbol#to_proc は引数を許すように。
    こっちの方が個人的には好みです。でも &foo(*args) だと現在のパーサでも通すので、& の次に来るものをどこまで許すかはちょっとだけポイントになるかも。String#to_proc を独自に定義したとき、&”hoge”(“fuga”) が動きませんでした、だと不公平感。
広告
2件のコメント leave one →
  1. k_tsj permalink
    2012/3/4 11:53:27 11:53

    Symbol#callを定義するというやり方もあるようです。

    http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/42787

  2. wanabe permalink*
    2012/3/4 12:53:36 12:53

    ああ、ブログを書きながらどこかで見た話だなと思ったらそれでした。ありがとうございます。
    Symbol#call ですか。call という名前から類推するとむしろ send 的な動作が期待されるように思うのでどうなのかな、と思います。
    それなら Symbol#[] はどうかな、と思ったらこれは定義済みで String#[] 相当の様子。このメソッド誰が使うんだろう。
    メール末尾の %w[12 45 32].map(&.to_i(9)).map(& * 2) のような文法はわかりやすくて好きです。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。