设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2537|回复: 3
打印 上一主题 下一主题

[已经解决] 有關模塊私有方法的問題

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
62 小时
注册时间
2011-1-28
帖子
35
跳转到指定楼层
1
发表于 2012-4-21 10:46: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 方法在模塊外部用到的話是如何寫的呢?

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
2
发表于 2012-4-21 18:29:04 | 只看该作者
使用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
复制代码
可能有更简洁的办法,大家不妨指出
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
62 小时
注册时间
2011-1-28
帖子
35
3
 楼主| 发表于 2012-4-21 23:22:50 | 只看该作者
本帖最后由 nokaiwai 于 2012-4-21 23:27 编辑
叶子 发表于 2012-4-21 18:29
使用module_function或者"self."只是定义模块方法,跟是否私有无关
以下例子可以将模块方法c私有化,具体见 ...


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

但是也感謝你的回答,雖然我還沒理解沒有self.的作用,但是知道了私有化的做法。謝謝
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
4
发表于 2012-4-22 10:58:11 | 只看该作者
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
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-13 00:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表