2016-11-14 42 views
1
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 

这究竟是为什么?这必须是一个错误,否则它是对信息封装的重要违反,对吗?

+1

http://stackoverflow.com/a/896633/10396 – AShelly

回答

2

你怎么从那个让你写

String = Array 
puts String.new.inspect 
#=> [] 

class Fixnum 
    def +(b) 
    self-b 
    end 
end 

puts 1+2 
#=> -1 

语言期待什么呢?

更严肃的说,在Ruby中几乎没有任何东西被禁止:它使得它更容易实验和学习Ruby内部工作。在某些情况下,它可以编写更简洁的代码,或者获得难以或不可能用更严格的语言重现的“神奇”行为。

在您的示例中,可以调用私有方法,但不能使用通常的语法。

2

这是怎么发生的?这必须是一个错误,否则它是一个重要的信息封装违规 ,对吧?

使用Object#send可让您调用尽管方法可见的方法。就那么简单。