Jam*_*sen 15 ruby visibility scope access-specifier class-method
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
Run Code Online (Sandbox Code Playgroud)
Jon*_*nam 12
这是一个与问题一起提供的代码片段.在类定义中使用"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
Run Code Online (Sandbox Code Playgroud)
我没有办法解决这个问题.文档说您无法指定私有方法的接收.此外,您只能从同一实例访问私有方法.类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
Run Code Online (Sandbox Code Playgroud)