这是违反ruby中封装的简单方法吗?
Is this a simple way to violate the encapsulation in ruby?
class Foo
@@first_time = true
def self.private_bar
if @@first_time
puts "Hi"
else
puts "Oi, you don't work here"
end
@@first_time = false
end
private_class_method :private_bar
public
def calling_private_method
self.class.send :private_bar
another_private_bar
end
end
f=Foo.new
f.calling_private_method
f.class.send :private_bar
输出应该是这样的:
Hi
NoMethodError: private method `private_bar'
然而,输出是:
Hi
Oi, you don't work
为什么会这样?这一定是个BUG,不然就是严重违反了信息封装对吧?
您对一种可以让您编写的语言有何期望
String = Array
puts String.new.inspect
#=> []
或
class Fixnum
def +(b)
self-b
end
end
puts 1+2
#=> -1
?
更严肃地说,Ruby 中几乎没有什么是禁止的:它使实验和学习 Ruby 内部工作变得更容易。在某些情况下,它可以编写更简洁的代码或获得 "magical" 使用更严格的语言更难或不可能重现的行为。
在您的示例中,可以调用私有方法,但您不能使用通常的语法。
Why is this happening? This must be a bug otherwise it is an important
violation of the encapsulation of information, right?
使用 Object#send
允许您调用方法,尽管它们是可见的。就这么简单。
class Foo
@@first_time = true
def self.private_bar
if @@first_time
puts "Hi"
else
puts "Oi, you don't work here"
end
@@first_time = false
end
private_class_method :private_bar
public
def calling_private_method
self.class.send :private_bar
another_private_bar
end
end
f=Foo.new
f.calling_private_method
f.class.send :private_bar
输出应该是这样的:
Hi
NoMethodError: private method `private_bar'
然而,输出是:
Hi
Oi, you don't work
为什么会这样?这一定是个BUG,不然就是严重违反了信息封装对吧?
您对一种可以让您编写的语言有何期望
String = Array
puts String.new.inspect
#=> []
或
class Fixnum
def +(b)
self-b
end
end
puts 1+2
#=> -1
?
更严肃地说,Ruby 中几乎没有什么是禁止的:它使实验和学习 Ruby 内部工作变得更容易。在某些情况下,它可以编写更简洁的代码或获得 "magical" 使用更严格的语言更难或不可能重现的行为。
在您的示例中,可以调用私有方法,但您不能使用通常的语法。
Why is this happening? This must be a bug otherwise it is an important violation of the encapsulation of information, right?
使用 Object#send
允许您调用方法,尽管它们是可见的。就这么简单。