回答編集履歴

1

せっかくなので長い説明を追加

2018/07/29 05:23

投稿

takahashim
takahashim

スコア1877

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
+ 以上、おまけの解説編でした。