2016-03-15 105 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 

的想法是,我们使原有方法的混叠副本,然后调用这个原始的私有方法来自同名的公共方法。