2015-04-20 120 views
17

我有一些靜態方法的類。每個人都必須調用一個常用的方法,但我試圖不公開這種後一種方法。將它私有隻允許從一個自己的類的實例訪問?受保護似乎並不能解決這裏的問題。Ruby類使用靜態方法調用私有方法?

如何隱藏do_calc在靜態上下文中被外部調用? (離開它可從第一兩個靜態方法被調用。)

class Foo 
    def self.bar 
    do_calc() 
    end 
    def self.baz 
    do_calc() 
    end 
    def self.do_calc 
    end 
end 
+1

你的問題是什麼? – sawa

+0

爲什麼'self.bar'調用帶括號和'self.baz'的方法呢? – sawa

+1

我認爲['private_class_method'](http://ruby-doc.org/core-2.0.0/Module.html#method-i-private_class_method)可以滿足您的要求。 – spickermann

回答

34

首先,static是不是真的紅寶石行話的一部分。

讓我們簡單的例子:

class Bar 
    def self.foo 
    end 
end 

它定義明確的目的,self,其在該範圍內返回包含類Bar在方法foo。 是的,它可以被定義爲類方法,但是靜態在Ruby中並沒有什麼意義。

然後private不起作用,因爲在顯式對象上定義方法(例如def self.foo)會繞過訪問限定符並使該方法公開。

你可以做什麼,是使用class << self語法打開包含類的元類,並有明確的方法爲實例方法:

class Foo 
    class << self 

    def bar 
     do_calc 
    end 

    def baz 
     do_calc 
    end 

    private 

    def do_calc 
     puts "calculating..." 
    end 
    end 
end 

這會給你你需要的東西:

Foo.bar 
calculating... 

Foo.baz 
calculating... 

Foo.do_calc 
NoMethodError: private method `do_calc' called for Foo:Class 
+1

而這個詞* lingo *也不是每個人的詞彙的一部分;) – Dorian

+0

沒錯。好點子。將用'行話'修改它。 – tompave

12

可以定義一個私有的類方法與private_class_method這樣的:

class Foo 
    def self.bar 
    do_calc 
    end 

    def self.baz 
    do_calc 
    end 

    def self.do_calc 
    #... 
    end 
    private_class_method :do_calc 
end