そうですね、原則としてはJavaで言うところのthisと思っていただければいいんではないかと思います。
Wikipediaの「this」を見ると、プログラミング言語の中では、thisを使う言語とselfを使う言語があるようです。RubyはObjective-CやPython(の慣習)と同じself派だった、ということですね。
メソッド定義のときにselfをつけることでクラスメソッドになること(つけないとインスタンスメソッドとなる?)
についてはちょっと特殊で、詳しく説明すると長くなるのですが(下に長い説明を書いてみました)、最初はそういう書き方のルールがある、と思っていただければよいかと思います。
おまけ: なぜクラスメソッドの定義にはselfをつけるのか・解説編
繰り返しになりますが、これは詳しい理屈は知らなくても「そういう書き方もある」と思ってもらえば大丈夫です。実用上困りません。
以下は「そうは言っても気になるので知りたい!」という人向けの説明です。
Rubyではクラスもオブジェクトである
クラスとオブジェクトは普通は別々なものなのですが、Rubyを含めた一部のオブジェクト指向プログラミング言語では、クラスもオブジェクトの一種になっています。
特に他のオブジェクト指向プログラミング言語をご存知の方には「は?」と思われるかもしれませんが、RubyではStringやHashはClassクラスのインスタンスです。
Rubyの対話環境、irbコマンドで試してみます。
console
1$ irb
2irb(main):001:0> String
3=> String
4irb(main):002:0> String.class
5=> Class
この辺はややこしい話につながるのですが(メタクラスとか)、それが気になる方には『メタプログラミングRuby第2版』という書籍がおすすめです。
Rubyでは特定のオブジェクトにだけメソッドを追加することもできる
一般的には、メソッドというのはクラス単位で定義されます。Stringのメソッドにreverse
があるとか。
ところが、RubyにはStringのうち、ある"abc"という文字列オブジェクトにだけメソッドspecial
を定義する、といったことができます。
console
1$ irb
2irb(main):001:0> a = "abc"
3=> "abc"
4irb(main):002:0> def a.special
5irb(main):003:1> 100
6irb(main):004:1> end
7=> :special
8irb(main):005:0> a.special
9=> 100
違う"abc"というオブジェクトには、special
メソッドは定義されないので使えません。
(上の続き)
irb(main):006:0> "abc".special
Traceback (most recent call last):
2: from /Users/takahashim/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
1: from (irb):7
こういう特定のオブジェクトにだけ使えるメソッドのことを「特異メソッド(singleton method)」と呼びます。
変わったメソッドかと思われるかもしれませんが、Rubyはこうなっているのです。
クラス定義の構文中ではselfはそのクラスを指す
ちょっと特殊なselfの使われ方として、クラス定義の中でもselfは使えます。その時、selfは何を指しているかと言うと、これはそのクラスになります。
console
1$ irb
2irb(main):001:0> class Foo
3irb(main):002:1> p "self: #{self}"
4irb(main):003:1> end
5"self: Foo"
6=> "self: Foo"
これも変わってるような気もしますが、ある種の納得感はありますね。
クラスメソッドはクラスオブジェクトの特異メソッドとして定義される
ここまで来れば準備完了です。おつかれさまでした。
ひょっとすると薄々感づかれたかもしれませんが、Rubyのクラスメソッドは、クラスオブジェクトの特異メソッドとして定義されているのです。これは「クラスメソッド = クラスが持つメソッド」という意味ではある意味わかりやすい仕組みではあります。
こんな感じで、Rubyの中ではそれなりに整合性を持っていろんなしくみができているのですが、初めて使う人には分かりにくいかもしれません。
なので、最初は「そういうものだ」として使ってみて、慣れてきた時に詳しく調べてみる、くらいの方がRubyを使う上ではちょうどいいんではないかと思います(他のプログラミング言語でも同様のことはあるかもしれません。Javaでもいきなりpublic static void main
と言われても「は?」と思われるかもしれませんが、最初はあまり気にせずこう書こう、と説明するような気もします)。
以上、おまけの解説編でした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/29 04:49
2018/07/29 05:24