回答編集履歴
1
せっかくなので長い説明を追加
test
CHANGED
@@ -10,4 +10,168 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
についてはちょっと特殊で、詳しく説明すると長くなるのですが、最初はそういう書き方のルールがある、と思っていただければよいかと思います。
|
13
|
+
についてはちょっと特殊で、詳しく説明すると長くなるのですが(下に長い説明を書いてみました)、最初はそういう書き方のルールがある、と思っていただければよいかと思います。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
### おまけ: なぜクラスメソッドの定義にはselfをつけるのか・解説編
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
繰り返しになりますが、これは詳しい理屈は知らなくても「そういう書き方もある」と思ってもらえば大丈夫です。実用上困りません。
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
以下は「そうは言っても気になるので知りたい!」という人向けの説明です。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
#### Rubyではクラスもオブジェクトである
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
クラスとオブジェクトは普通は別々なものなのですが、Rubyを含めた一部のオブジェクト指向プログラミング言語では、クラスもオブジェクトの一種になっています。
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
特に他のオブジェクト指向プログラミング言語をご存知の方には「は?」と思われるかもしれませんが、RubyではStringやHashはClassクラスのインスタンスです。
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
Rubyの対話環境、irbコマンドで試してみます。
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
```console
|
48
|
+
|
49
|
+
$ irb
|
50
|
+
|
51
|
+
irb(main):001:0> String
|
52
|
+
|
53
|
+
=> String
|
54
|
+
|
55
|
+
irb(main):002:0> String.class
|
56
|
+
|
57
|
+
=> Class
|
58
|
+
|
59
|
+
```
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
この辺はややこしい話につながるのですが(メタクラスとか)、それが気になる方には『メタプログラミングRuby第2版』という書籍がおすすめです。
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
#### Rubyでは特定のオブジェクトにだけメソッドを追加することもできる
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
一般的には、メソッドというのはクラス単位で定義されます。Stringのメソッドに`reverse`があるとか。
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
ところが、RubyにはStringのうち、ある"abc"という文字列オブジェクトにだけメソッド`special`を定義する、といったことができます。
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
```console
|
80
|
+
|
81
|
+
$ irb
|
82
|
+
|
83
|
+
irb(main):001:0> a = "abc"
|
84
|
+
|
85
|
+
=> "abc"
|
86
|
+
|
87
|
+
irb(main):002:0> def a.special
|
88
|
+
|
89
|
+
irb(main):003:1> 100
|
90
|
+
|
91
|
+
irb(main):004:1> end
|
92
|
+
|
93
|
+
=> :special
|
94
|
+
|
95
|
+
irb(main):005:0> a.special
|
96
|
+
|
97
|
+
=> 100
|
98
|
+
|
99
|
+
```
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
違う"abc"というオブジェクトには、`special`メソッドは定義されないので使えません。
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
```
|
108
|
+
|
109
|
+
(上の続き)
|
110
|
+
|
111
|
+
irb(main):006:0> "abc".special
|
112
|
+
|
113
|
+
Traceback (most recent call last):
|
114
|
+
|
115
|
+
2: from /Users/takahashim/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
|
116
|
+
|
117
|
+
1: from (irb):7
|
118
|
+
|
119
|
+
```
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
こういう特定のオブジェクトにだけ使えるメソッドのことを「特異メソッド(singleton method)」と呼びます。
|
124
|
+
|
125
|
+
変わったメソッドかと思われるかもしれませんが、Rubyはこうなっているのです。
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
#### クラス定義の構文中ではselfはそのクラスを指す
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
ちょっと特殊なselfの使われ方として、クラス定義の中でもselfは使えます。その時、selfは何を指しているかと言うと、これはそのクラスになります。
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
```console
|
138
|
+
|
139
|
+
$ irb
|
140
|
+
|
141
|
+
irb(main):001:0> class Foo
|
142
|
+
|
143
|
+
irb(main):002:1> p "self: #{self}"
|
144
|
+
|
145
|
+
irb(main):003:1> end
|
146
|
+
|
147
|
+
"self: Foo"
|
148
|
+
|
149
|
+
=> "self: Foo"
|
150
|
+
|
151
|
+
```
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
これも変わってるような気もしますが、ある種の納得感はありますね。
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
#### クラスメソッドはクラスオブジェクトの特異メソッドとして定義される
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
ここまで来れば準備完了です。おつかれさまでした。
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
ひょっとすると薄々感づかれたかもしれませんが、Rubyのクラスメソッドは、クラスオブジェクトの特異メソッドとして定義されているのです。これは「クラスメソッド = クラスが持つメソッド」という意味ではある意味わかりやすい仕組みではあります。
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
こんな感じで、Rubyの中ではそれなりに整合性を持っていろんなしくみができているのですが、初めて使う人には分かりにくいかもしれません。
|
172
|
+
|
173
|
+
なので、最初は「そういうものだ」として使ってみて、慣れてきた時に詳しく調べてみる、くらいの方がRubyを使う上ではちょうどいいんではないかと思います(他のプログラミング言語でも同様のことはあるかもしれません。Javaでもいきなり`public static void main`と言われても「は?」と思われるかもしれませんが、最初はあまり気にせずこう書こう、と説明するような気もします)。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
以上、おまけの解説編でした。
|