2012/12/24

RubyMotionでinstance_evalとdefine_methodを使ってみようず あとついでにsendメソッドも

この記事は RubyMotion Advent Calendar 2012 の24日目の記事です。

クリスマス・イブですね。皆さまいかがお過ごしでしょうかリア充爆発しろなんて言わないよ絶対。

 

さてさてここ最近とても大好きなRubyMotion、Xcodeが大嫌いであるがゆえに使い始めておりまして、ワタクシ決してRuby畑のニンゲンではなく、第1回のRubyMotionもくもく会 でしたか、@satococoa に「Rubyぽく書くために読んだらいい本かWebページ教えてください」と質問したところ「メタプログラミングRubyに決まってるだろJK」とのお答えをいただきましてシコシコと読んでる最中でございます。 ※まだ読み終えてない←

 

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 44,947

 

本書で紹介されているテクニックのいくつかはRubyMotionにすでに移植されておりまして、こちらのエントリが詳しいです。

RubyMotion Metaprogramming

 

このエントリでは RubyMotion Metaprogramming で紹介されてるテクニックのうち

  • instance_eval
    • インスタンスの外部からインスタンス変数, インスタンスメソッドにアクセスするテクニック
  • define_method
    • インスタンスのメソッドを動的に作成するテクニック

を使って、アプリを書き換えてみようかと思います。

 

 

instance_eval / インスタンスの外部からインスタンス変数にアクセスするテクニック

題材には作成中のアプリのそこかしこで使っている、InformViewという自作パーツを使用します。

修正前のソースはこちら

 

IMG 0003

 

これを表示するための記述はこんな感じでした。

 

それをこうしたい。

 

で、InformViewクラスはこんな記述になりました。

クラスメソッドからSingletonで作成されたインスタンスのインスタンス変数にアクセスするためにinstance_evalを使っています。Rubyのクラスメソッドは

def self.method_name() end

の形式で定義できます。この例ではself.showとself.hideですね。

 

 

define_method / インスタンスのメソッドを動的に作成するテクニック

これまた題材は作成中のアプリです。

修正前のソースはこちら

 

IMG 0004

 

それぞれReadabilityの「記事の既読・未読を切り替えるもの」「記事のFavを切り替えるもの」でして、やっている処理はほぼ同じなわけです。修正前のソースの toggleFavoriteメソッド() とtoggleArchive() メソッドを見比べてくみてください。違うのはAPIにPostするパラメータ名だけですね。

 

これをこのように変更しました。toggleFavoriteメソッド() とtoggleArchive() メソッド が!ひとつの記述で!

 

 

最後に

『RubyMotionを使うからにはRubyぽく書いてみようず!』というドヤ顔タイトルを考えていたんですけど、出来上がりがあんまりRubyぽくなかったのでやめました( ;∀;)

 

Rubyっぽさとはいったいどうすればでるのか!

Rubyっぽさとはいったいなんなのか!

 

あと、こちらのソースではメソッドを動的に呼び出せるsendメソッドを使っています。

motion-octofeed / app / activity_template_github_api.rb

RubyMotionのSDKがあれば、お手元のシミュレータ・実機で動作確認できます。

ダウンロードはこちら → amazedkoumei / motion-octofeed

 

それでは皆さま!よいクリスマス・イブをお過ごしください!!

 

Comments