2016-03-15 112 views
-3

可以使用send調用私有方法,但有沒有辦法以某種方式猴子修補類以常規方式調用它?將私有或受保護的方法轉換爲公開

+0

這不是「咆哮私人方法如何是私人的原因」。這些語言功能出於某種原因,並不旨在輕鬆繞過。正如你已經指出的那樣,你可以用'.send()'來規避它。你也許也可以爲它補丁,你爲什麼不嘗試呢?但爲什麼?這是一個完全理智而合理的問題,旨在幫助你實現目標,因爲它看起來像你使用錯誤的工具來解決這個問題... – Carpetsmoker

+0

有問題的方法是'ActiveRecord :: Base.sanitize_sql_array' – synapse

+0

爲什麼你想調用這個方法嗎?你想達到什麼目的?需要使用該工具修復哪些問題? – Carpetsmoker

回答

1

Module#public有竅門。

class Foo 
    private 
    def hello 
    "hello" 
    end 
end 

class Foo 
    public :hello 
end 
+0

優秀的方法 –

0

將私有方法轉換爲公共方法並不是一個好主意。你仍然可以這樣做。

考慮您的原始類和方法如下

class A 
    private 
    def a 
    p "hello" 
    end 
end 

你可以將這個方法a轉換爲公共如下

class A 
    alias_method :original_a, :a 
    def a 
    original_a 
    end 
end 

的想法是,我們使原有方法的混疊副本,然後調用這個原始的私有方法來自同名的公共方法。

相關問題