Project1

标题: 有關模塊私有方法的問題 [打印本页]

作者: nokaiwai    时间: 2012-4-21 10:46
标题: 有關模塊私有方法的問題
如何調用私有方法呢?
  1. module A
  2.   def c
  3.     p "hi"
  4.   end
  5.   def self.b
  6.     c
  7.   end
  8. end
  9. A.instance_methods   ###["c"]
  10. A.b                             ###line 6: NameError occurred. undefined local variable or method 'c' for A:Module
复制代码
當然 加入module_function 或 把c改成self.c 是不會發生error的
但如果不想 c 方法在模塊外部用到的話是如何寫的呢?dsu_plus_rewardpost_czw
作者: 叶子    时间: 2012-4-21 18:29
使用module_function或者"self."只是定义模块方法,跟是否私有无关
以下例子可以将模块方法c私有化,具体见代码注释:
  1. module A
  2.   def self.c
  3.     p "hi"
  4.   end
  5.   def self.b
  6.     c
  7.   end
  8. end
  9. class << A # 打开模块A这个单例
  10.   private :c # 将模块方法c私有化
  11. end
  12. A.b # => "hi"
  13. A.c # => NoMethodError: private methed "c" called
复制代码
可能有更简洁的办法,大家不妨指出
作者: nokaiwai    时间: 2012-4-21 23:22
本帖最后由 nokaiwai 于 2012-4-21 23:27 编辑
叶子 发表于 2012-4-21 18:29
使用module_function或者"self."只是定义模块方法,跟是否私有无关
以下例子可以将模块方法c私有化,具体见 ...


我總覺得在模組定義方法時 使用和不使用self. 有不同作用 不然的話ruby作者可以直接把 self. 省略啊?

但是也感謝你的回答,雖然我還沒理解沒有self.的作用,但是知道了私有化的做法。謝謝
作者: 叶子    时间: 2012-4-22 10:58
nokaiwai 发表于 2012-4-21 23:22
我總覺得在模組定義方法時 使用和不使用self. 有不同作用 不然的話ruby作者可以直接把 self. 省略啊?

但 ...

是否使用self,当然有不同作用啊,我只是说这个跟私有化无关
不用self的话,定义的是实例方法
使用self的话,定义的是模块方法/单例方法
  1. module A
  2. def b
  3. end
  4. end
  5. class C
  6. include A
  7. end

  8. a = C.new
  9. a.b # ok
  10. A.b # error
复制代码
  1. module A
  2. def self.b
  3. end
  4. end
  5. class C
  6. include A
  7. end

  8. a = C.new
  9. a.b # error
  10. A.b # ok
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1