w = Widget.new # Create a Widget
w.send :utility_method # Invoke private method!
w.instance_eval { utility_method } # Another way to invoke it
w.instance_eval { @x } # Read instance variable of w
Widget クラス (下記) に関連する上記の例を見ると、send および instance_eval メソッドは、非公開および保護された可視性によって提供されるすべての保護に違反しています。もしそうなら、あなたの定義が尊重されるという保証がないのに、なぜRubyでプライベートで保護されたアクセスに煩わされるのですか?
class Widget
def x # Accessor method for @x
@x
end
protected :x # Make it protected
def utility_method # Define a method
nil
end
private :utility_method # And make it private
end