以下代码有效:
class MyClass
def method_a
method_b
end
private
def method_b
puts "Hello!"
end
end
m = MyClass.new
m.method_a
将对method_b的调用更改为self.method_b
但不起作用:
def method_a
self.method_b
end
我得到NoMethodError
。我的印象是self
只是在实例方法中解析为类的实例。 为什么self.method_b
会导致问题?
注意:self.method_b
在private
更改为protected
时有效。
注意:如果将上述方法更改为类方法,则从method_a调用self.method_b
不会抛出NoMethodError
。
答案 0 :(得分:4)
这就是private
方法在Ruby中的工作方式。它们不能使用显式接收器调用(除非它是一个setter方法;见下文)。
在Pickaxe的 Access Control 部分阅读更多内容。
使用=
调用名称以self.method_name = ...
结尾的私有方法,因为这是区分它们与设置局部变量所必需的:
class Foo
def try
set_foo(1) # Invokes private method
self.set_foo(2) # ERROR: private method `set_foo' called for ...
self.send(:set_foo,3) # Invokes private method
bar = 1 # Sets local variable
self.bar = 2 # Invokes private method
self.send(:bar=,3) # Invokes private method
end
private
def set_foo(v)
@foo = v
end
def bar=(v)
@bar = v
end
end
Foo.new.bar = 42 # ERROR: private method `bar=' called for ...
答案 1 :(得分:3)