7
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
なぜ.
と::
の両方が存在するのですか?なぜ.
だけではないのですか?モジュール関数へのアクセス方法が両方ともRubyに存在するのはなぜですか?
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
なぜ.
と::
の両方が存在するのですか?なぜ.
だけではないのですか?モジュール関数へのアクセス方法が両方ともRubyに存在するのはなぜですか?
スコープ解決演算子(::
)は、定数、インスタンスメソッド、およびクラスメソッドを解決できるため、適切な場所を探している限り、その演算子を本質的にどのメソッドに対しても使用できます。
さらに、funcというメソッドはモジュールAのクラスメソッドとして定義されているので( "static"メソッドに似ています)、直接モジュールに属していますモジュールを受信者としてドット演算子で呼び出されます。それがクラスメソッドであるため、モジュールAのインスタンスは、「FUNC」への可視性を持っていないことに注意:
aye = Object.new.extend(A)
aye::funC# raises NoMethodError
aye.func # raises NoMethodError
方法がインスタンスメソッドとして定義した場合、それだけにドット演算子と呼ばれることができますモジュールのインスタンス
module B
def func2
puts "OK!"
end
end
B::func2 # raises NoMethodError
B.func2 # raises NoMethodError
bee = Object.new.extend(B)
bee::func2 # "OK!"
bee.func2 # "OK!"
@RHSeeger Rubyはポストモダンな言語なので、物事を行うための方法は1つだけでなく、複数のものを持つ方が良いと考えることもできます。 RubyではC、Java、&cなどのような最小限の言語コアが実際には使われていません。 –
@Wayne:実際の質問が間違っていると誤解したため、コメントを削除しました。実際の質問が「なぜ同じものなのか」という質問があったとき、私は「違いは何ですか?」と読んでいます。メアリスクの答えがこれに十分に答えているかどうか分からないのですが、私のコメントは本当に適切ではありません。 – RHSeeger
ランダムなごちそちとして、私は「ポストモダン」はプログラミング言語にラベルを付ける悪い方法だと確信しています。私は、Rubyを最新のプログラミング言語と呼んでいます。つまり、プログラミング言語の開発の多くは、使いやすく表現力豊かな(保守が容易な)ものを作るために開発されたものです。 Rubyについては本当に革命的なことは何もないと言われています。私は言語が大好きで、それが他の言語の機能の素晴らしい組み合わせだと思っていますが、それは以前の言語からの飛躍であるテーブルにもたらされたものは考えられません。 – RHSeeger