相关疑难解决方法(0)

了解Ruby中的私有方法

class Example
 private
 def example_test
  puts 'Hello'
 end
end

e = Example.new
e.example_test
Run Code Online (Sandbox Code Playgroud)

这当然是行不通的,因为我们指定了Example(e)的显式接收器 - 实例,这是针对"私有规则"的.

但我无法理解,为什么人们不能在Ruby中做到这一点:

class Foo
 def public_m
  self.private_m # <=
 end
 private
 def private_m
  puts 'Hello'
 end
end

Foo.new.public_m
Run Code Online (Sandbox Code Playgroud)

public_m方法定义(即self)中的当前对象是Foo的实例.那么为什么不允许呢?为了解决这个问题,我必须self.private_m改为公正private_m.但为什么这个不同,是不是selfFoo里面的一个例子public_m?谁是裸字private_m呼叫的接收者?不是self- 实际上你省略了什么,因为Ruby会为你做这件事(会在self上调用private_m)吗?

我希望我没有太多混淆,我对Ruby仍然很新鲜.


编辑:谢谢你的所有答案.把它们放在一起我能(最终)神交明显的(而不是一个人,谁从来没有见过的东西,比如Ruby那么明显):这self本身可以是显性和隐性的接收器,并且赚取差价.因此,有两条规则,如果你要调用一个私有方法:self必须是隐式接收器,以及自我必须是当前类的一个实例(Example在这种情况下-而且,只有当自己好像里面实例方法的定义,在此期间发生方法执行).如果我错了,请纠正我.

class Example 

 # self as an explicit receiver (will throw an error)
 def explicit 
  self.some_private_method
 end

 # self as an …
Run Code Online (Sandbox Code Playgroud)

ruby access-specifier

49
推荐指数
3
解决办法
4万
查看次数

标签 统计

access-specifier ×1

ruby ×1