红宝石作为一种面向对象的语言。 这也就意味着我发什么消息,我严格发送的类的对象/实例。
例:
class Test
def test1
puts "I am in test1. A public method"
self.test2
end
def test2
puts "I am in test2. A public Method"
end
end
有道理我打电话方法test2
对self
的对象
但我不能这样做
class Test
def test1
puts "I am in test1. A public method"
self.test2 # Don't work
test2 # works. (where is the object that I am calling this method on?)
end
private
def test2
puts "I am in test2. A private Method"
end
end
当test2
是public method
我可以调用它self
(够公平,方法发送到自己的对象)。 但是,当test2
是private method
,我不能把它叫做自我。 那么,是我的发送方法的对象?
问题
在Ruby中,私有方法不能直接使用显式接收器,称为; 自不会在这里得到任何特殊待遇。 根据定义,当你调用self.some_method
要指定自己的明确的接收机,因此Ruby说:“不!”
解决方案
Ruby有它的方法查找规则。 有可能是对规则更加规范源(比去Ruby源代码等),但这个博客帖子勾画出右侧顶部的规则:
1) Methods defined in the object’s singleton class (i.e. the object itself)
2) Modules mixed into the singleton class in reverse order of inclusion
3) Methods defined by the object’s class
4) Modules included into the object’s class in reverse order of inclusion
5) Methods defined by the object’s superclass, i.e. inherited methods
换言之,私有方法是首先在自我抬头,而不需要(或允许)明确的接收器。
这里是我的发送方法的对象
这是self
。 Whenenver你没有指定接收器,接收器self
。
定义private
用Ruby是私有方法只能被称为没有一个接收器,IE浏览器的隐式接收器self
。 有趣的是,它没有打扰你所有的puts
的方法,这也是一个私有的实例方法;-)
注:有一个例外。 私人制定者可以用一个明确的接收器只要接收器调用, self
。 事实上,他们必须明确的接收器被调用,否则会有与局部变量赋值的不确定性:
foo = :fortytwo # local variable
self.foo = :fortytwo # setter
self
意味着你是在对象的当前实例。
class Test
def test1
self
end
end
调用Test.new.test1
将返回类似#<Test:0x007fca9a8d7928>
这是目前正在使用的测试对象的实例。
定义一个方法作为私人意味着它只能在当前对象内使用。
当使用self.test2
,你去外面当前对象(你得到的实例),并调用方法。
所以你调用一个私有方法,如果你的对象,不是这就是为什么你不能。
当你不指定self
,你仍然是当前对象内。
所以,你可以调用该方法。 Ruby是足够聪明,知道test2
是一种方法,而不是一个变量,并调用它。
文章来源: Why won't Ruby allow me to specify self as a receiver inside a private method?