2012-10-01から1ヶ月間の記事一覧

スコープ、instance_eval

スコープのフラット化 プログラムがスコープを切り替えて、新しいスコープをオープンする場所はクラス定義、モジュール定義、メソッド呼び出しの三個所。それぞれclass, module, defキーワードで印がつけられている。三つのキーワードはそれぞれスコープゲー…

動的ディスパッチ、動的メソッド、method_missing

動的メソッド メソッドを動的に呼び出すにはドットではなくObject#sendを使って呼び出す class MyClass def my_method(my_arg) my_arg * 2 end end obj = MyClass.new obj.send(:my_method, 3) #=> 6 コードの実行時に呼び出すメソッドを決めている。この技…

オブジェクトモデル

オープンクラス 既存のクラスをオープンしてメソッドを追加すること class String def to_alphanumeric gsub /[^\w\s]/, '' end end 既に同名のメソッドが存在するのに、オープンクラスで追加してしまうとエラーになる。何も考えずにクラスにコードを追加し…

文字列

文字列リテラルは以下5つある。 シングルクォート ダブルクォート %Q %q ヒアドキュメント シングルクォート 文字列が式展開を含まないときに使う p 'question #{a}' #=> "question #{a}" ダブルクォート 文字列が式展開を含むときに使う。 p "double quote …

Module, Mixin

モジュールとはメソッド、クラス、定数をグループ化する方法の一つ。モジュールをincludeすることでMixinが実現できる。mixinされたモジュールはスーパークラスとして動作する。 class Person include Comparable attr_reader :name def initialize(name) @n…

トランザクション、オブジェクト、クロージャとしてのブロック

トランザクションとしてのブロック ファイルを開き確実にクローズ処理をする場合もブロックを使うと簡単に書ける。 class File def self.open_and_process(*args) f = File.open(*args) yield f f.close() end end File.open_and_process("TestFile", "r") d…

Enumerator-外部イテレータ

RubyでもJavaのような外部イテレータを作成することができる。配列、ハッシュなどのコレクションに対してto_enumメソッドを呼び出すことでできる。 a = [1, 3, "cat"] h = { dog: "canine", fox: "lupine" } enum_a = a.to_enum enum_h = h.to_enum enum_a.n…

配列、ハッシュ、ブロック、イテレータ

配列 まずは配列 a = [1, 3, 5, 7, 9] a[-1] # => 9 a[-2] # => 7 a[-99] # => nil 後ろから指定することもできるインデックスを[start, count]で指定する。startからはじまるcount個のオブジェクトへの参照が返る a = [1, 3, 5, 7, 9] a[1, 3] # => [3, 5, …

クラス、オブジェクト

クラスは以下のように定義する。 class BookInStock def initialize(isbn, price) @isbn = isbn @price = Float(price) end end b1 = BookInStock.new("isbn1", 3) p b1 インスタンス変数は@で宣言してますね。 initializeはオブジェクトを初期する関数です…