免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2749 | 回复: 7
打印 上一主题 下一主题

sigleton class里怎样得到对象的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-25 18:38 |只看该作者 |倒序浏览
  1. str = "ABC"
  2. class << str
  3.   p self
  4. end
复制代码
显示self是#<Class:#<String:0x15d4bb0>>这么样一个东西
我要想在class << str里得到str的值"ABC"怎么做呢?

论坛徽章:
0
2 [报告]
发表于 2011-03-28 13:15 |只看该作者
得需要多写一点代码:
  1. def sync_singleton_value object
  2.   class << object
  3.     class << self
  4.       attr_accessor:special_value
  5.     end
  6.    
  7.     def singleton_class
  8.       class << self;self;end
  9.     end  
  10.   end
  11.   object.singleton_class.special_value = object
  12. end

  13. # 下面是用法
  14. str = "ABC"
  15. sync_singleton_value str

  16. class << str
  17.   p special_value
  18. end
复制代码
另外,在使用时,每次class << str之前,都需要先用sync_singleton_value方法来同步一下value,如上面的代码所示。

论坛徽章:
0
3 [报告]
发表于 2011-03-29 14:16 |只看该作者
Ruby1.9下,singleton_class已经有了。所以就不用定义了,

  1. def sync_singleton_value object
  2.   class << object
  3.     class << self
  4.       attr_accessor:special_value
  5.     end
  6.   end
  7.   object.singleton_class.special_value = object
  8. end

  9. # 下面是用法
  10. str = "ABCD"
  11. sync_singleton_value str

  12. # special_value属性 和str引用的是同一个对象,所以用special_value属性就可
  13. class << str
  14.   p special_value
  15. end
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-03-29 14:46 |只看该作者
又修改了一下,没有本质区别,用在Ruby1.9下

  1. def sync_singleton_value object
  2.   object.singleton_class.singleton_class.instance_eval{ attr_accessor:special_value }
  3.   object.singleton_class.special_value = object
  4. end

  5. # 下面是用法
  6. str = "ABCD"
  7. sync_singleton_value(str)

  8. class << str
  9. p special_value
  10. end

复制代码

论坛徽章:
0
5 [报告]
发表于 2011-03-29 14:57 |只看该作者
又找到一个方法,(Ruby1.9)

  1. str = "ABCD"
  2. str.singleton_class.instance_eval "@special_value = str"

  3. #@special_value 和 str 引用的是同一个对象
  4. class << str
  5.   p @special_value
  6. end
复制代码
Ruby1.8下得先实现一个singleton_class方法。

论坛徽章:
0
6 [报告]
发表于 2011-03-29 15:56 |只看该作者
楼上玩杂耍啊?

论坛徽章:
0
7 [报告]
发表于 2011-03-29 16:11 |只看该作者
回复 6# 2gua
哈哈,主要是楼主的问题挺有意思,就多捣鼓了几下。

论坛徽章:
0
8 [报告]
发表于 2011-03-30 07:58 |只看该作者
鼓励楼上啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP