有没有一种方法可以从Ruby中的实例调用私有Class方法?
时间:2020-03-05 18:41:40 来源:igfitidea点击:
当然除了self.class.send:method,args ...
。我想在类和实例级别提供一个相当复杂的方法,而无需重复代码。
更新:
@乔纳森·布拉南(Jonathan Branam):这是我的假设,但我想确保没有其他人找到解决方法。 Ruby中的可见性与Java中的可见性非常不同。我们也很正确,private
不适用于类方法,尽管这将声明一个私有类方法:
class Foo class <<self private def bar puts 'bar' end end end Foo.bar # => NoMethodError: private method 'bar' called for Foo:Class
解决方案
回答
除非我有误会,否则我们是否仅需要以下内容:
class Foo private def Foo.bar # Complex logic goes here puts "hi" end public def bar Foo.bar end end
当然,如果我们想避免对类名进行硬编码,则可以更改第二个定义以使用self.class.send方法。
回答
这是一个伴随问题的代码段。在类定义中使用"私有"不适用于类方法。我们需要使用" private_class_method",如以下示例所示。
class Foo def self.private_bar # Complex logic goes here puts "hi" end private_class_method :private_bar class <<self private def another_private_bar puts "bar" end end public def instance_bar self.class.private_bar end def instance_bar2 self.class.another_private_bar end end f=Foo.new f=instance_bar # NoMethodError: private method `private_bar' called for Foo:Class f=instance_bar2 # NoMethodError: private method `another_private_bar' called for Foo:Class
我没有办法解决这个问题。该文档说我们不能指定私有方法的接收。同样,我们只能从同一实例访问私有方法。类Foo是与给定实例Foo不同的对象。
不要把我的答案作为最后的答案。我当然不是专家,但是我想提供一个代码段,以便其他尝试回答的人将拥有正确的私有类方法。