为什么不会红宝石让我指定自己的私有方法内的接收器?(Why won't Ruby allow

2019-06-24 23:40发布

红宝石作为一种面向对象的语言。 这也就意味着我发什么消息,我严格发送的类的对象/实例。

例:

 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

有道理我打电话方法test2self的对象

但我不能这样做

  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

test2public method我可以调用它self (够公平,方法发送到自己的对象)。 但是,当test2private method ,我不能把它叫做自我。 那么,是我的发送方法的对象?

Answer 1:

问题

在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

换言之,私有方法是首先在自我抬头,而不需要(或允许)明确的接收器。



Answer 2:

这里是我的发送方法的对象

这是self 。 Whenenver你没有指定接收器,接收器self

定义private用Ruby是私有方法只能被称为没有一个接收器,IE浏览器的隐式接收器self 。 有趣的是,它没有打扰你所有的puts的方法,这也是一个私有的实例方法;-)

注:有一个例外。 私人制定者可以用一个明确的接收器只要接收器调用, self 。 事实上,他们必须明确的接收器被调用,否则会有与局部变量赋值的不确定性:

foo = :fortytwo      # local variable
self.foo = :fortytwo # setter


Answer 3:

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?