オープンクラス
下記のメソッドは文字列からアルファベットとスペース以外を取り除くメソッド
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
|
Object
のclass
はClass
。
でも、Class
のsuperclass
はmodule
であり、module
のsuperclass
はObject
。
ではClass
の上位classのObject
はClass
?
ちゃんと理解ができていない。。これは今度深く調べてみよう。
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章