查看: 2140|回复: 3

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

[复制链接]
梦石
0
星屑
784
在线时间
380 小时
注册时间
2009-3-9
回帖
336
发表于 2012-3-11 10:41:44 | 显示全部楼层 |阅读模式

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

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

×
近来无事,研究代码时候发下一个奇怪的现象,先看这个脚本:
[pre lang="ruby" line="1"]class A
  attr_accessor :size
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @size = 0
  end
  def size
    return @size / 2
  end
end
$a = A.new
$a.size += 1
$a.size += 1
$a.size += 1
$a.size += 1
$a.size += 1
p $a.size[/pre]
这个最后输出数字竟然是 0 {:1_29:}@ ??
这是为什么呢?
理论上应该是2.5才对啊。。
新手学习中.....努力吧!!

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-3-11 11:21:31 | 显示全部楼层
把/2改成/2.0先

点评

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

使用道具 举报

老黄鸡

梦石
4
星屑
45693
在线时间
7948 小时
注册时间
2009-7-6
回帖
13336

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2012-3-11 13:25:05 | 显示全部楼层
同意楼上,应该是整形和浮点的问题
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

Fuzzy Ginkgo

梦石
0
星屑
61105
在线时间
1933 小时
注册时间
2010-6-26
回帖
1535

烫烫烫开拓者

发表于 2012-3-11 15:13:22 | 显示全部楼层
本帖最后由 orzfly 于 2012-3-11 15:15 编辑

@fux2@ky52879@晴兰

let's trace
[pre lang="ruby"]$sm=[]
class Class
  def sm(sym)
    self.class_eval do
      return if (@@__smed||=[]).include?(sym)
      @@__smed.push sym
      alias :"old_#{sym}" :"#{sym}"
      define_method sym do |*args, &block|
        $sm << [self, sym, *args]
        old = $sm[-1]
        old.push self.send(:"old_#{sym}", *args, &block)
        old[-1]
      end
    end
  end
end
$sm=[]

class A
  attr_accessor :size
  def initialize
    @size = 0
  end
  def size
    return @size / 2
  end
  sm :size
  sm :size=
end
$a = A.new
$a.size += 1
$a.size += 1
$a.size += 1
$a.size += 1
$a.size += 1
p $a.size
puts "\nsm result: "
puts $sm.map { |j| j.join "\t" }.join "\n"[/pre]

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
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部