特異メソッド

特定のインスタンスだけが実行できるメソッドを特異メソッド、というそうです。特異メソッド以外にも Ruby では"特異"という単語がよくでてくるような気がします。特異メソッドは英語では "Singleton Method"、と呼ばれるようです。 a = "hello" b = a.dup d…

method_missing と instance_eval を使った Decorator

Kernel#method_missing を使ってみたいです。method_missing は、任意のクラスに対してメソッドが呼び出されたとき、対象のメソッドがそのクラスのクラス階層のどこにも実装されてなかった場合に呼び出されるメソッド、だそうです。Perl の AUTOLOAD に似て…

クラスはオブジェクトであり、クラス名は定数である

ウサギ本を読んでいたところ、先の Object#const_get の理解を助けてくれる解説を見つけました。P.292 の "クラス名は定数である" の箇所です。また、Ruby のクラスは Class オブジェクトというオブジェクトでした。したがって、クラスメソッドを呼び出すの…

Klass

"Class" ではなく "Klass" と書くのはなぜ? の答えは、id:drawnboy さんによると ローカル変数なクラスオブジェクトを指すときに ”class” は予約語なので ”klass” と書くようです。 とのことです。(昨晩、夢の中でまた別の人が同じことを言っていた気がしま…

alias を使った Adapter パターン

ruby には alias 式でメソッド、演算子、グローバル変数、正規表現後方参照の別名を作ることができるようです。Adapter パターン を Ruby っぽくするために alias を使って書き替えてみます。 #!/usr/local/bin/ruby class Banner def initialize(string) @s…

Object#const_get

クラス名からクラスを得る方法は、リファレンスマニュアルによると eval を使う方法、Object#const_get を使う方法の二通りがあるようです。 #!/usr/local/bin/ruby class Player attr_accessor :name, :age def initialize(name, age) @name = name @age = …

Abstract Factory パターン

id:hyuki さんのデザインパターン本から Abstract Factory パターンを移植してみます。 #!/usr/local/bin/ruby class Item def initialize(caption) @caption = caption end end class Link < Item def initialize(caption, url) super(caption) @url = url …

instance_eval?

eval と言えば、デスクトップリファレンスに instance_eval というメソッドが載っていました。 オブジェクトのコンテキストで eval する。オブジェクトのインスタンス変数などに直接アクセスできる。 とあるのですが、よくわかりません。あと、よくサンプル…

Builder パターン

id:hyuki さんのデザインパターン本から Prototype パターンを移植してみます。 #!/usr/local/bin/ruby class Director def initialize(builder) @builder = builder end def construct @builder.make_title("Greeting") @builder.make_string("朝から昼にか…

Prototype パターン

id:hyuki さんのデザインパターン本から Prototype パターンを移植してみます。 #!/usr/local/bin/ruby class Manager def initialize @showcase = Hash.new end def register (name, proto) @showcase[name] = proto end def create(protoname) p = @showca…

Object クラスと Kernel の関係

リファレンスマニュアルを見たところ Ruby の全オブジェクトの祖先クラスである Object には実は initialize だけが定義されていて、他にはメソッドがないようです。では、Object#class や Object#methods といったメソッドは一体何者でしょうか。その正体は…

Object.methods

"Hello, World!".methods.each do |method| puts method endで String のメソッド一覧が作れました。

Singleton パターン

Singleton パターンを実装してみました。 #!/usr/local/bin/ruby class Singleton private_class_method :new @@instance = nil def Singleton.instance @@instance = new unless @@instance @@instance end end object1 = Singleton.instance object2 = Sin…

String#each

先の RSS を JavaScript に変換するスクリプトでは def to_js self.to_html.split("?n").collect { |line| line.gsub!(/'/, "?'") "document.writeln('#{line}');" }.join("?n") endという処理を書いていましたが、String の API を眺めていたところ、String…

抽象クラスとモジュール

Ruby のモジュールはインスタンスが生成されないことを約束するという意味では抽象クラスです。一方、Java の抽象クラスというのは、インスタンスが生成されないことを約束する以外に、そのサブクラスに対して自身が持つ抽象メソッドの実装を強制させる役割…

Factory Method パターン

id:hyuki さんのデザインパターン本から Factory Method パターンを移植してみます。まずは素で移植したものです。 #!/usr/local/bin/ruby class Factory def create(owner) p = self.create_product(owner) self.register_product(p) return p end end clas…

ERB を使って RSS を JavaScript に変換する

ERB の使い方を覚えたので、ERB を使って RSS を JavaScript に変換したいです。よくある類の処理ですが、これを ERB を使ってやってみます。 #!/usr/local/bin/ruby require 'open-uri' require 'rss/1.0' require 'rss/2.0' require 'erb' module RSS::Jav…

ERB を使ってみる

Ruby でテンプレートエンジンを使ってみたいです。Rails の Action View では ERB が使われるようです。まずは単体で ERB を使ってみたいと思います。ERB は Ruby 1.8 以降には標準で含まれているようなので require 'erb'するだけで使えました。 #!/usr/loc…

Ruby の '=> '#2

まつもとさんにコメントをいただきました。びっくりしました。:foo => 'bar' と書くのはめんどくさいよ、という話をしてみたところ Ruby 1.9 では foo: barと書けるそうです。なるほどー。実装されるのが楽しみです。これを 1.8 でできるようなマジックはな…

Ruby で文字コード変換

nuna さんに教えてもらいました。1.8.2 以降では NKF#nkf を使うと良いそうです。リモートの RSS を取得して、そのタイトルを EUC-JP で出力してみます。 #!/usr/local/bin/ruby require 'open-uri' require 'rss/1.0' require 'nkf' content = Kernel.open(…

Ruby リファレンスマニュアル

プログラミング言語 Ruby リファレンスマニュアル nuna さんによるとこのオンラインのマニュアルが一番充実しているのではないか、とのこと。

initialize に渡ってきたパラメタをインスタンス変数に丸投げする

http://d.hatena.ne.jp/rubyo/20060402/1143993335 の続きです。ささださんに教えてもらいました。有名な奥の手、だそうです。 #!/usr/local/bin/ruby class Player attr :name, :age define_method(:initialize) { |@name, @age| } end player = Player.new…

RSS を YAML に変換する#2

http://d.hatena.ne.jp/rubyo/20060402/1143963071 の続きです。nuna さんがコメントで色々教えてくれました。 バージョンが異なるフィードを、バージョンを意識せずに parse するには require を複数書くとよい (http://www.cozmixng.org/~rwiki/?cmd=view;…

Ruby の '=> '

ハッシュのキーと値のペアを記述するときなどに :key => 'value'とします。このとき左側はほとんどの場合シンボルのような気がします。なので、'=>' が与えられた場合左側が Bareword だった場合は自動的にシンボルとして扱ってくれてもいいのになあ、と思う…

Rails の API を調べる

Rails の API を調べるには id:secondlife さんによる http://api.rails2u.com/ を使うと便利そうです。

O/R マッパ(Active Record) を使ってみる

Ruby で O/R マッパを使って RDBMS を操作したいです。Ruby on Rails に付属してくる O/R マッパの Active Record を使ってみます。Rails は元々インストールしていたので、そこから Active Record 単体で使ってみます。mysql に、 +-------------+---------…

Enumerable で拡張してみます

ruby には Enumerable というモジュールがあり、集合を扱うクラス(コレクション)にこのモジュールを mix-in すると、Enumerable が備える各種メソッドが使えるようになるそうです。例えば collect find_all map grep など各種メソッドが使えます。そこで、先…

Iterator パターン

id:hyuki さんのデザインパターン本の Iterator パターンを Ruby に移植してみます。 #!/usr/local/bin/ruby class Iterator def has_next end def next end end class Aggregate def iterator end end class Book attr_reader :name def initialize(name) @…

RSS を YAML に変換する

ここまで学んだことの応用で、RSS をリモートから取得して YAML に変換してファイルに保存、というのをしたいです。RSS2YAML というクラスを作って処理してみることにしました。 RSS2YAML.new('http://d.hatena.ne.jp/rubyo/rss').to_yamlで RSS::RDF オブジ…

RSS フィードを処理する

Ruby で RSS フィードを処理したいです。open-uri でこの日記のフィードを取得して rss/1.0 で parse するというのをしてみます。 #!/usr/local/bin/ruby require 'open-uri' require 'rss/1.0' content = Kernel.open('http://d.hatena.ne.jp/rubyo/rss') r…