新手问题 self 关键字求指导

lengcb · 2015年10月14日 · 最后由 lengcb 回复于 2015年10月20日 · 2709 次阅读

关于self.my_methodmy_methodself.privateprivate的两者之间各自的区别,求指点。 《Ruby 元编程》第二版,第 35 页。 主要问一下self.methodmethod的不同之处,希望大神说的直白点

我有点理解了 2.2.1 :001 > class C 2.2.1 :002?> def public_method 2.2.1 :003?> self.private_method 2.2.1 :004?> end 2.2.1 :005?> private 2.2.1 :006?> def private_method 2.2.1 :007?> end 2.2.1 :008?> end => :private_method 2.2.1 :009 > C.new.public_method NoMethodError: private method `private_method' called for # C.new 调用 public_method 方法,所以 self.private_method 中的 self 就指的是 C.new,而不能明确指定接受者来调用私有方法,所以这样是错误的。 去掉 self,就成了通过隐性的接受者 self 调用了,就能通过了,是这个意思吗

分别是类方法和方法。 self.private 似乎没见过。

#2 楼 @chenge 在《Ruby》元编程第二版,35 页。它那个『私有(private)究竟意味着什么』,我不是太懂,发现自己对 self 关键字理解不够透彻

#1 楼 @lengcb 你这个理解应该是对的吧。确实这些东西是比较模糊的。

private 的意思很清楚,就是不能外部调用,只能内部调用。这样的好处是可以随意地修改私有方法名字这些,减少耦合度,改善可维护性。

self 就是中文:自己的意思,指代对象。 这里其实有两个 self,一个是指类,一个是指的类 new 的对象。

private 就是意味这不能显式指定 self!这个你要仔细体会,非常巧妙的设计。

self 相当于站在第三者的角度调用函数。

@lengcb 数学专业的,学编程优势很大吗,弱弱的问下

Ruby 中 self 是 class 中一个具有 scope 的关键字,在 class 中不同的 scope 中其表明的意义也是不同的。位于 class 定义中的 self 都代表的 class 本身,位于 method 定义中的 self 代表的是 class 的 instance,但是这个前提是 method 定义不以 self.method_name 开始,若以 self.method_name 开始定义的话,method 定义中如果使用了 self,此 self 也是 class 本身。举一个例子:

class Game
   def start_game
     self.start_time = Time.zone.now
     # Without implementation 
   end
   def self.game_areas
     # Without implementation 
   end
end

start_game 方法中得 self 指代的是 class Game 的 instance,而 game_areas 方法前面的 self 是在 class 中的 scope,self 指代的是 Game 本身,同时,如果 game_areas 方法中还有使用 self 关键字的话,self 同样指代的 Game 本身。

#7 楼 @xiongxin8802 人家说有优势,我刚起步,基础弱,没个比较也看不出来

需要 登录 后方可回复, 如果你还没有账号请 注册新账号