0

定数を再定義しようとすると、Ruby は警告のみを表示し、エラーは表示しません。では、いつでも Ruby で定数を再定義できるのでしょうか?

send メソッドを使用して、クラスのプライベート メソッドを呼び出すこともできます。

Const = 12
puts Const
#only an warning: already initialized constant Const
Const = 14
puts Const #Displays 14
class MyClass
private
    def priv
        puts 'In private method'
    end
end
obj = MyClass.new
#Error: private method `priv' called for #<MyClass:0x7f2cfda21738> (NoMethodError)
#obj.priv
#but this is fine!
obj.send(:priv)

Ruby でのそのような設計の背後に何か根拠はありますか? これらは、それぞれ定数とアクセス指定子の基本的な考え方に違反していませんか?

これらのデザインの実際の実用的な用途はありますか? いくつかの例があれば素晴らしいでしょう!

注:ここでは、Ruby の定数とプライベート メソッドに関する多くの質問や議論が見られますが、これらの背後にある理由に関連するものは見つかりませんでした。

4

1 に答える 1

3

についてsendは、答えはかなり単純です。リフレクションを使用すると、すべての賭けがオフになります。これは他のほとんどの言語と同じであることに注意してください。たとえば、リフレクションを使用して Java のアクセス制限を回避することもできます。

定数の場合、警告が表示されます。やってはいけないことをしていると言われます。しかし、Ruby は、自分が何をしているかを理解していると信頼できる言語です。邪魔になりません。自分の足を撃ちたいなら、それが許されるべきです。または、もっとシニカルな見方をすると、Ruby には非常に多くの邪悪なことができるので、定数を再定義することはそれほど重要ではありません。

于 2013-03-07T14:39:26.650 に答える