メソッド名を呼ぶときにメソッド名の前に付けるのはピリオドなのかコロンコロンなのか
結論。
メソッド名の1文字目が小文字の場合はピリオドとコロンコロンのどちらでもよい。
メソッド名の1文字目が大文字の場合は複雑なルール。基本ピリオドにしとけ。そうするとコロンコロンのクラススコープの定数呼び出しから区別し易い。
以下実験結果をほとんど解説なしで書いてみます。
# メソッド
class Nikuman
def my_name # その1
#def self.my_name # その2
#def Nikuman.my_name # その3
#def Nikuman::my_name # その4
puts "肉まん"
end
end
niku = Nikuman.new
# クラススコープの変数
class Nikuman
my_name = "肉まん" # その5・クラススコープの変数
end
niku = Nikuman.new
■メソッド名の1文字目が小文字(上記の例だと「my_name」の部分)
○:エラーが出なくて「肉まん」と表示された
×:エラーが出た
その1 | その2 | その3 | その4 | その5 | |
---|---|---|---|---|---|
Nikuman::my_name | × | ○ | ○ | ○ | × |
Nikuman::my_name() | × | ○ | ○ | ○ | × |
Nikuman.my_name | × | ○ | ○ | ○ | × |
Nikuman.my_name() | × | ○ | ○ | ○ | × |
niku::my_name | ○ | × | × | × | × |
niku::my_name() | ○ | × | × | × | × |
niku.my_name | ○ | × | × | × | × |
niku.my_name() | ○ | × | × | × | × |
■メソッド名の1文字目が大文字(上記の例だと「my_name」を「MyName」と書き換えた場合)
○:エラーが出なくて「肉まん」と表示された
×:エラーが出た
その1 | その2 | その3 | その4 | その5 | |
---|---|---|---|---|---|
Nikuman::MyName | × | × | × | × | ○ |
Nikuman::MyName() | × | ○ | ○ | ○ | × |
Nikuman.MyName | × | ○ | ○ | ○ | × |
Nikuman.MyName() | × | ○ | ○ | ○ | × |
niku::MyName | × | × | × | × | × |
niku::MyName() | ○ | × | × | × | × |
niku.MyName | ○ | × | × | × | × |
niku.MyName() | ○ | × | × | × | × |
【広告】
COMMENT
すっかりnameメソッドが継承元クラスにあることを忘れてましたorz
ですので、nameメソッドの箇所をmy_nameメソッドに書き換えて、よりポイントを絞って書いてみました。
そして、クラス定数というのを改め、クラススコープの定数やらクラススコープの変数やらに書き換えました。
大変勉強になります。
ところでhatenaでご紹介の「ふつうのコンパイラをつくろう」本はとても面白そうですね。目次を見るだけでwktkします。
Nikuman::nameとかNikuman.nameとかは、Nikumanクラスの中でdef nameしない限り、もともとClassクラスのnameメソッドが呼ばれているはずです。
とりいそぎ。