2015-02-08 58 views
0

爲什麼private僅適用於實例方法,而不適用於類方法?不僅如此,爲什麼private_class_method方法使類方法變爲私有方法?Ruby中的private和private_class_method關鍵字

class Foo 

    private 

    def self.private_class_method 
    puts 'hello from private_class_method' 
    end 


    def private_instace_method 
    puts 'hello from private_instace_method' 
    end 
end 

Foo.private_class_method #Ok! 
Foo.new.private_instace_method #error: private method `private_instace_method' called for #<Foo:0x000001020873b8> 

這個怎麼樣?

class Foo 

    private_class_method :private_class_method 

    def self.private_class_method 
    puts 'hello from private_class_method' 
    end 

    private 

    def private_instace_method 
    puts 'hello from private_instace_method' 
    end 
end 

Foo.private_class_method #Ok! 
Foo.new.private_instace_method #error: private method `private_instace_method' called for #<Foo:0x000001020873b8> 

如何使類方法爲私有?

+0

[如何訪問Ruby中的私有類方法?](http://stackoverflow.com/questions/27859296/how-to-access-private-class-methods-in-ruby) – Severin 2015-02-08 07:43:42

+0

此外,你應該考慮'private_class_method'方法名與'private_class_method'類方法相交http://ruby-doc.org/core-1.9.3/Module.html#method-i-private_class_method – freemanoid 2015-02-08 09:24:40

回答

2

您可以創建一個私有類方法是這樣的:

class Foo 
    def self.will_be_private 
    # ... 
    end 
    private_class_method :will_be_private 
end 

或者這樣:

class Foo 
    class << self 
    private 
    def will_be_private 
     # ... 
    end 
    end 
end 

雖然有可能在做一個類的方法私,我很難想到一個很好的有理由這樣做。海事組織一個私人類的方法是一種代碼氣味,並指出有一件事應該被提取到它自己的類中。

+0

爲什麼第一種情況會產生錯誤' private_class_method':錯誤的參數數量(1代表0)(ArgumentError)'? – 2015-02-08 07:46:15

+0

@AlexanderSupertramp兩個版本都適合我。你使用哪個版本的Ruby? – spickermann 2015-02-08 08:22:19

+0

我的意思是,不應該錯誤已被'私人方法調用'?它是2.1.2p95 – 2015-02-08 08:26:01