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

  • Pocket
  • このエントリーをはてなブックマークに追加
  • 163 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

関連記事

405681608017

Ruby技術者認定試験Silverに卒業単位やばい学生だけど合格できたお話【試験合格記】

まえがき Ruby技術者認定試験のシルバーの試験を受験してきました。...

記事を読む

【AWS】AmazonSNSをRubyスクリプトから叩いてプッシュ通知をしてみる

まえがき 最近iPhoneアプリのプッシュ通知を色々と試しているので...

記事を読む

progressbar-ruby-1progressbar-ruby-1.png

Rubyで簡単にCUIのプログレスバーを使うライブラリ

まえがき RubyでCUIで動かすプログラムなんかを作っている時にプ...

記事を読む

image_search_1image_search_1.png

Google画像検索の糞gemを公開してみた。

まえがき Google画像検索のgemとかないかなーと探していたとこ...

記事を読む

RailsでHamlを使っちゃおう

まえがき RailsのプロジェクトでHamlを使うためのメモ。やっぱ...

記事を読む

新着記事

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を使ってデーモン化してみた時...

記事を読む

スポンサーリンク

  • Sorry. No data so far.

PAGE TOP ↑