2006-03-09 優しいRailsの育て方 [長年日記]

[Rails][Rails1.1] Symbol#to_proc

ActiveSupport

Add Symbol#to_proc, which allows for, e.g. [:foo, :bar].map(&:to_s). [Marcel Molina Jr.]

これでつよ、ずっと欲しかったものは!と、これだけじゃ、丁度、迷宮入りした事件の説明なしに、エレガントな解決方法を先に言ってるようなものなのでわからないですね。では、まず直面している事件から整理しましょう。

事件

配列の中身を文字列にする

array = [1,2,3]
array.collect{|i| i.to_s}

この時の仮変数 i がメンド教徒には面倒なのですよ。コレクションの要素全部に対して「このメソッドを適用」したいだけなのに、要素を持ち出すのが面倒なのです。メソッド名だけを渡したいのです。しかも、Ruby の落とし穴NO1(くまくまー調べ)である「ブロック引数のスコープ問題」があるために余計にメン度が高いのです。

  _☆ノハヽ_ 
 /从 ;w;)l/! <i なんて要らないの・・・クゥ〜ン
 i二し二J二!/| 
 |_____|/ 
[誰か拾ってください]

付随する問題点

ブロック引数のスコープ問題

i = '舞波'
[1,2,3].each_with_index{|val, i| ...}
i # => 2

このスコープ問題はRubyの言語上の一番の欠点だと思っています。仕様じゃ済まされない程度の欠陥だと未だに思っています。衝突を考慮するのが面倒だし、競合を避けると名前も長くなっちゃうし。個人的にはRubyは自分に一番合う最高の言語なんですが、この部分だけが唯一不満な点です。もしRubyに興味を持った人がRubyの恩恵に気付く前に、万が一ここでハマったら使うのをやめるんじゃないかと心配でなりません。と、話を戻しますと、非本質的な部分であるブロック引数を持ち出す必要があるのと、しかもそのケアが面倒だ、というのが事件のあらましです。

Rails1.1 でこう変わる

で、Rails1.1 からは、

Symbol#to_proc を使うと

array = [1,2,3]
array.collect(&:to_s)

エクセレント!!しかも、実装は1行だけ!

active_support/core_ext/symbol.rb

class Symbol #:nodoc:
  def to_proc
    Proc.new { |obj, *args| obj.send(self, *args) }
  end
end

Marcel Molina Jr.エロイ!!かしこ過ぎる!!to_proc なんて、島八段は今日も全く見えませんでしたよ。これでよかったのかー。お前は何年Rubyやってるんだ、という話ですね。

 :☆ノノハ: 
  :从;’w’;):<あぁイイ…感動で震えが来るよぉ…
  :( つと): 
  :ヽ__)_ノ:

例1

お陰で、今日も入力されたカラム名の妥当性検証がさっぱりしたコードになりましたよと。

before

unknown_column_names = column_names.collect{|column_name| column_name.to_s} - model_class.column_names

after

unknown_column_names = column_names.collect(&:to_s) - model_class.column_names

例2

僕達のはびたむのテーブル名だってほら。

before

habtm_table_name = active_records.collect{|klass| klass.table_name}.sort.join('_')

after

habtm_table_name = active_records.collect(&:table_name}.sort.join('_')

短くなれば1行でできるメソッドチェインも増えてだいぶすっきりしそうだし。(map にしたりで)。join の引数も下の方が断然笑顔だし。(必死)。これに限らず、Railsで拡張された長所(ActiveSupport)がいつの日か Ruby 本体にフィードバックされると嬉しいですね。やはり一番は Dependency の autoloading かなぁ。生Rubyに戻ったら require が一番面倒な気がしている舞波なのでした。(今日のわんこ風に)。

本日のツッコミ(全2件) [ツッコミを入れる]
_ 从*’w’) (2006-03-12 06:28)

クゥ〜ン!(意訳:長くなったので 20060311 の日記にしました)

_ かいどー (2008-06-01 14:49)

例2のafterの}が)かもしれない症候群


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2006年
3月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

未来

コンタクト