有没有办法从Ruby中的实例调用私有Class方法?

除了self.class.send :method, args...当然。 我想在类和实例级别提供一个相当复杂的方法,而不需要复制代码。


更新:

@Jonathan Branam:这是我的假设,但我想确保没有其他人找到方法。 Ruby中的可见性与Java中的可见性非常不同。 你也很正确, private不能在类方法上工作,尽管这会声明一个私有类方法:

 class Foo class < NoMethodError: private method 'bar' called for Foo:Class 

这是一个与问题一起提供的代码片段。 在类定义中使用“private”不适用于类方法。 您需要使用“private_class_method”,如以下示例所示。

 class Foo def self.private_bar # Complex logic goes here puts "hi" end private_class_method :private_bar class < 

我没有办法解决这个问题。 文档说您无法指定私有方法的接收。 此外,您只能从同一实例访问私有方法。 类Foo是与给定Foo实例不同的对象。

不要把我的答案作为最终答案。 我当然不是专家,但我想提供一个代码片段,以便其他尝试回答的人将拥有正确的私有类方法。

让我为这个或多或少奇怪的解决方案和非解决方案列表做出贡献:

 puts RUBY_VERSION # => 2.1.2 class C class << self private def foo 'Je suis foo' end end private define_method :foo, &method(:foo) def bar foo end end puts C.new.bar # => Je suis foo puts C.new.foo # => NoMethodError 

如果你的方法只是一个实用函数 (也就是说,它不依赖于任何实例变量),你可以将该方法放入一个模块中并includeextend该类,以便它既可以作为私有类方法又可以作为私有类。实例方法。

现在你不再需要辅助方法了。 您可以使用方法定义简单地内联它们。 这对Java人员应该非常熟悉:

 class MyClass private_class_method def self.my_private_method puts "private class method" end private def my_private_method puts "private instance method" end end 

不,你不能从实例方法调用私有类方法。 但是,您可以使用private_constant帮助器方法在私有嵌套类中将私有类方法实现为公共类方法。 有关更多详细信息,请参阅此博文 。

这是使用“真正的”私有类方法的方法。

 class Foo def self.private_bar # Complex logic goes here puts "hi" end private_class_method :private_bar class < 

干杯

除非我误解,否则你不需要这样的事情:

 class Foo private def Foo.bar # Complex logic goes here puts "hi" end public def bar Foo.bar end end 

当然,如果你想避免硬编码类名,你可以改变第二个定义来使用你的self.class.send方法……