以外self.class.send :method, args...
, 当然。我想在类和实例级别提供一个相当复杂的方法,而不需要重复代码。
UPDATE:
@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
这是与问题相关的代码片段。在类定义中使用“private”不适用于类方法。您需要使用“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 实例不同的对象。
不要将我的答案视为最终答案。我当然不是专家,但我想提供一个代码片段,以便其他尝试回答的人将拥有正确的私有类方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)