WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Ruby のハッシュにオブジェクトっぽくアクセス

本日は、 Ruby のちょっとしたネタをご紹介です。

Ruby で Hash の要素にアクセスするには、もちろん添え字演算子 [ 〜 ] を使います。でも、例えば JavaScript では、添え字演算子に加えてピリオド演算子でもアクセスできます。これを Ruby でも実現できないかと思ってやってみました。

というわけで、まずはソースコード。

このように定義した Hash#objectize! を呼び出すと、そのハッシュオブジェクトに特異メソッドとして method_missing が追加され、未定義のメソッド呼び出しを要素へのアクセスに変換します。例えば、以下のような感じでアクセスできます。

hash = { :foo => "foo" } 
hash.objectize! 
p hash.foo       # -> "foo" 
hash.bar = "bar" 
p hash[:bar]     # -> "bar"

ただし、本来のメソッド呼び出しのほうが常に優先されますのでご注意ください。とくに代入と組み合わせるとわけのわからないことになります。

hash = {}
hash.objectize!
hash.length = 100
p hash.length     # -> 0
p hash[:length]   # -> 100

なんでこんなことを思いついたかというと、例えば Rails でビューに以下のようなフォームがあるとき。

<% form_for :s, :html => { :method => 'get' } do |t| -%>
  <%= t.text_field :keyword %>
  <%= submit_tag %>
<% end -%>

コントローラにこう書くだけで

class TestController < ApplicationController
  def index
    @s = params[:s] || {}
    @s.objectize!
  end
end

送信した内容を再びフォームの初期値にしたかったのです。検索フォームとかに便利なんじゃないでしょうかね。

・・・もっと簡単な方法があったら教えてください (^^;

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles