Ruby オープンクラスを使って既存クラスの拡張をしてみる

  • Pocket
  • このエントリーをはてなブックマークに追加
  • 169 follow us in feedly

まえがき

今日から新しく『メタプログラミングRuby』とい書籍を読み始めた。

その中の一番最初に取り上げられていた『オープンクラス』を使ったサンプルソースを書いてみる

オープンクラスとは既存のクラスを拡張するRubyの特徴的な機能で、これを使うことで、例えば標準のクラスである『Numeric』『String』などのクラスに対して新しい機能を持たせることができる。

いままで使う機会がなかったけど、本で読んでみるとなんか便利そうでかっこ良くコード書ける感じがするのでやってみる

開発環境

  • Ruby 1.9.3
  • pokemon_zukan 0.4.0

今回作るプログラム

まずは今回作るサンプルプログラムの簡単な説明

今回は『Numeric』『String』『Array』の3つのクラスに対して新しい機能(メソッド)を実装する。

そのメソッドは『pokemon()』というインスタンスメソッド。

『1.pokemon』ならNo1のポケモンの情報を返す

『”ピカチュウ”.pokemon』ならピカチュウの情報を返すというものだ。

Arrayは要素をイテレータで回して『Numeric』および『String』のpokemonメソッドを呼ぶ

準備

さて、ここで『Rubyってポケモンの情報も扱えるんだ・・』ってなったかた。

そんなこと標準ではできません。

まずは、『pokemon_zukan』というgemのライブラリをインストールしましょう!!

詳しくはこちら

http://www.absolute-keitarou.net/blog/?p=676

http://www.absolute-keitarou.net/blog/?p=676

今は新しくなって色々変わったところもあるけど、導入や基本的な使い方は一緒だ。

サンプルソース

ほいでこれがそのサンプルソース。

# coding: utf-8

class Numeric
  def pokemon
    PokemonZukan::find self
  end
end

class String
  def pokemon
    PokemonZukan::find_by_name self
  end
end

class Array
  def pokemon
    self.map{|x| x.pokemon}
  end
end

require 'pokemon_zukan'
require 'pp'

pp 1.pokemon
pp "ミュウ".pokemon
pp [1, 2, "フシギバナ"].pokemon

実行してみるとこんな感じになる

#<PokemonZukan:0x007ff8329155f0
 @classification="たねポケモン",
 @height="0.7",
 @name="フシギダネ",
 @no="001",
 @tribeValue=["45", "49", "49", "65", "65", "45"],
 @type=["くさ", "どく"],
 @weight="6.9">
#<PokemonZukan:0x007ff833041040
 @classification="しんしゅポケモン",
 @height="0.4",
 @name="ミュウ",
 @no="151",
 @tribeValue=["100", "100", "100", "100", "100", "100"],
 @type=["エスパー"],
 @weight="4.0">
[#<PokemonZukan:0x007ff832867bd0
  @classification="たねポケモン",
  @height="0.7",
  @name="フシギダネ",
  @no="001",
  @tribeValue=["45", "49", "49", "65", "65", "45"],
  @type=["くさ", "どく"],
  @weight="6.9">,
 #<PokemonZukan:0x007ff832866b90
  @classification="たねポケモン",
  @height="1.7",
  @name="フシギソウ",
  @no="002",
  @tribeValue=["60", "62", "63", "80", "80", "60"],
  @type=["くさ", "どく"],
  @weight="13.0">,
 #<PokemonZukan:0x007ff8328bc4c8
  @classification="たねポケモン",
  @height="2.0",
  @name="フシギバナ",
  @no="003",
  @tribeValue=["80", "82", "83", "100", "100", "80"],
  @type=["くさ", "どく"],
  @weight="100.0">]

期待通りの結果だ。

あとがき

という、オープンクラス便利だね。というエントリーでした。

おすすめ書籍

メタプログラミングRuby
メタプログラミングRuby
posted with amazlet at 13.12.23
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 49,276
パーフェクトRuby (PERFECT SERIES 6)
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 6,964

関連記事

Rubyハッシュのキーをオブジェクトプロパティに変換する

まえがき Rubyでハッシュの配列をオブジェクトプロパティとして扱い...

記事を読む

410120560471

ソーシャルサイト上でのサイトURLのシェア数を取得するRubyGemライブラリ『social_counter』を公開しました

まえがき 特定のサイトURLがTwitterやFacebookやはて...

記事を読む

vim-rspec-1vim-rspec-1.png

VimでRSpecのテストを実行できるようにする

まえがき 今回はVimから直接RSpecのテストを実行する方法をメモし...

記事を読む

Railsアプリをクロスドメインに対応したAPIサーバーにする

まえがき 外部に立てたRailsのサーバーをAPIサーバー化して、ロー...

記事を読む

rails-pryrails-pry.png

Railsでpry使おうとして困ったのでメモ

まえがき Rubyのirbの拡張版のpryをrails consol...

記事を読む

新着記事

no image

PHPでRubyのirbっぽいインタラクティブなスクリプトが実行できる「boris」

まえがき PHPでもRubyのirbみたいなことがしたくて探してみたと...

記事を読む

2015年の抱負と去年の振り返り〜よちよちWEB業界1年経験して〜

まえがき あけましておめでとうございます。今年もどうぞよろしくお願いし...

記事を読む

Java SE 7 Bronze試験(1Z0-802)を受けてきました

まえがき 以前から少し受けてみたかった試験『Java SE 7 Bro...

記事を読む

HubotでJenkinsのジョブを実行する

まえがき HubotをつかってJenkinsのジョブをじっこうしてみた...

記事を読む

no image

Hubotをforeverでデーモン化する

まえがき 今回はHubotをforeverを使ってデーモン化してみた時...

記事を読む

スポンサーリンク

PAGE TOP ↑