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

Project1

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

[讨论] 大家来讨论一下 attr_accessor 的用法吧

[复制链接]

Lv2.观梦者

梦石
0
星屑
722
在线时间
375 小时
注册时间
2009-3-9
帖子
398
跳转到指定楼层
1
发表于 2012-3-11 10:41:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
近来无事,研究代码时候发下一个奇怪的现象,先看这个脚本:
RUBY 代码复制
  1. class A
  2.   attr_accessor :size
  3.   #--------------------------------------------------------------------------
  4.   # ● 初始化对像
  5.   #--------------------------------------------------------------------------
  6.   def initialize
  7.     @size = 0
  8.   end
  9.   def size
  10.     return @size / 2
  11.   end
  12. end
  13. $a = A.new
  14. $a.size += 1
  15. $a.size += 1
  16. $a.size += 1
  17. $a.size += 1
  18. $a.size += 1
  19. p $a.size

这个最后输出数字竟然是 0 {:1_29:}@ ??
这是为什么呢?
理论上应该是2.5才对啊。。
新手学习中.....努力吧!!

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60804
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

2
发表于 2012-3-11 11:21:31 | 只看该作者
把/2改成/2.0先

点评

一样的。。没有任何用处  发表于 2012-3-11 11:49
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
41525
在线时间
7592 小时
注册时间
2009-7-6
帖子
13502

开拓者贵宾

3
发表于 2012-3-11 13:25:05 | 只看该作者
同意楼上,应该是整形和浮点的问题
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60804
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

4
发表于 2012-3-11 15:13:22 | 只看该作者
本帖最后由 orzfly 于 2012-3-11 15:15 编辑

@fux2@ky52879@晴兰

let's trace
RUBY 代码复制
  1. $sm=[]
  2. class Class
  3.   def sm(sym)
  4.     self.class_eval do
  5.       return if (@@__smed||=[]).include?(sym)
  6.       @@__smed.push sym
  7.       alias :"old_#{sym}" :"#{sym}"
  8.       define_method sym do |*args, &block|
  9.         $sm << [self, sym, *args]
  10.         old = $sm[-1]
  11.         old.push self.send(:"old_#{sym}", *args, &block)
  12.         old[-1]
  13.       end
  14.     end
  15.   end
  16. end
  17. $sm=[]
  18.  
  19. class A
  20.   attr_accessor :size
  21.   def initialize
  22.     @size = 0
  23.   end
  24.   def size
  25.     return @size / 2
  26.   end
  27.   sm :size
  28.   sm :size=
  29. end
  30. $a = A.new
  31. $a.size += 1
  32. $a.size += 1
  33. $a.size += 1
  34. $a.size += 1
  35. $a.size += 1
  36. p $a.size
  37. puts "\nsm result: "
  38. puts $sm.map { |j| j.join "\t" }.join "\n"


the result of /2 is
  1. sm result:
  2. #<A:0x1a4c588>        size        0
  3. #<A:0x1a4c588>        size=        1        1
  4. #<A:0x1a4c588>        size        0
  5. #<A:0x1a4c588>        size=        1        1
  6. #<A:0x1a4c588>        size        0
  7. #<A:0x1a4c588>        size=        1        1
  8. #<A:0x1a4c588>        size        0
  9. #<A:0x1a4c588>        size=        1        1
  10. #<A:0x1a4c588>        size        0
  11. #<A:0x1a4c588>        size=        1        1
  12. #<A:0x1a4c588>        size        0
复制代码
the result of /2.0 is

  1. sm result:
  2. #<A:0x169c578>        size        0.0
  3. #<A:0x169c578>        size=        1.0        1.0
  4. #<A:0x169c578>        size        0.5
  5. #<A:0x169c578>        size=        1.5        1.5
  6. #<A:0x169c578>        size        0.75
  7. #<A:0x169c578>        size=        1.75        1.75
  8. #<A:0x169c578>        size        0.875
  9. #<A:0x169c578>        size=        1.875        1.875
  10. #<A:0x169c578>        size        0.9375
  11. #<A:0x169c578>        size=        1.9375        1.9375
  12. #<A:0x169c578>        size        0.96875
复制代码
由此可知 size += 1 被翻译成了 size = size + 1 来执行

评分

参与人数 1星屑 +400 收起 理由
fux2 + 400 认真的讨论

查看全部评分

我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-5 18:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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