JQ Blog

オブジェクトモデル

オープンクラス

下記のメソッドは文字列からアルファベットとスペース以外を取り除くメソッド

1
2
3
def to_alphanumeric(s)
  s.gsub /[^\w\s]/, ''
end

オープンクラスを使えば、

1
2
3
4
5
class String
  def to_alphanumeric
    gsub /[^\w\s]/, ''
  end
end

こう書くこともできる。
標準クラスのStringを書き換える。すると、

1
2
"!a #b+c".to_alphanumeric
=> "a bc"

こういうふうに適用される。

クラス定義

1
2
3
4
5
6
7
8
9
10
11
class C
  def my_method
    puts "my_method"
  end
end

class C
  def my_method2
    puts "my_method2"
  end
end

class Cを定義してまたclass Cをさらに定義するとどうなるだろう。
class Cを上書きすると思ったが実際叩いてみたら

1
2
3
4
5
6
C.new.my_method
my_method
=> nil
C.new.my_method2
my_method2
=> nil

上書きじゃなく、class Cに追加する形になる。

定数

定数はディレクトリとファイルのようにパスで呼び出すことができる。

1
2
3
4
5
6
7
8
9
10
11
12
13
module M
  MyConstant = "ABCDE"

  class C
    MyConstant = "12345"
  end
end

M::MyConstant
=> "ABCDE"

M::C::MyConstant
=> "12345"

クラスオブジェクト

クラスオブジェクトをみてみるため、"hello"からたどり着いてみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
"hello".class
=> String

String.class
=> Class

Class.instance_methods(false)
=> [:allocate, :new, :superclass]

String.superclass
=> Object

Object.superclass
=> BasicObject

BasicObject.superclass
=> nil

Class.superclass
=> Module

Module.superclass
=> Object

そうなんだ!と思いながら1つ気になる点がある。

1
2
Object.class
=> Class

ObjectclassClass
でも、Classsuperclassmoduleであり、modulesuperclassObject
ではClassの上位classのObjectClass? ちゃんと理解ができていない。。これは今度深く調べてみよう。

self

class定義の時のself

1
2
3
4
5
6
7
8
9
10
11
12
13
class C
  self
end
=> C

class C
  def my_method
    self
  end
end

C.new.my_method
=> #<CC:0x007ffbe8a67e08>

method内でのselfはオブジェクトを指す。method外でのselfはクラスを指す。

privateキーワードのself

privateメソッドのルール:「明示的なレシーバーをつけて呼び出せない」 下記は明示的なselfをつけているのでエラーとなる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class C
  def public_method
    self.private_method
  end

  private

  def private_method
    puts "ABCDE"
  end
end

C.new.public_method
NoMethodError: private method `private_method'

selfを削除すると動作するようになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class C
  def public_method
    private_method
  end

  private

  def private_method
    puts "ABCDE"
  end
end

C.new.public_method

ABCDE
=> nil

参照

本「メタプログラミングRuby」第1章