| 赞 | 402 |
| VIP | |
| 好人卡 | |
| 积分 | 251 |
| 经验 | |
| 最后登录 | 2024-7-2 |
| 在线时间 | 3339 小时 |
- 梦石
- 1
- 星屑
- 24088
- 在线时间
- 3339 小时
- 注册时间
- 2011-7-8
- 回帖
- 3862

|
发表于 2021-8-18 16:06:07
|
显示全部楼层
本帖最后由 guoxiaomi 于 2021-8-18 16:21 编辑
不完全是这样,如果等级越界,level = 后面的内容计算出来了一个整数:比如level = 0 就是新建了一个全新的临时变量level,并且赋值为 0;但是如果等级没有越界,实际执行了 level = level,就会什么都不发生,本行跳过。此时如你所说的,出现的level都是传入的那个。
可以看下面的测试代码和结果。由于ruby里整数是即时值,所以我把一个BigDecimal对象传进来:- require 'bigdecimal'
- class A
- def level=(level)
- p [level, level.class, level.object_id]
- level = [level, BigDecimal('1')].min
- p [level, level.class, level.object_id]
- get_level(level)
- end
- def get_level(level)
- p [level, level.class, level.object_id]
- end
- end
- a = A.new
- a.level = BigDecimal('100')
- a.level = BigDecimal('-100')
复制代码 输出是:- [0.1e3, BigDecimal, 70368280579580]
- [0.1e1, BigDecimal, 70368280578900] # 100 > 1,level 是新创建的临时变量
- [0.1e1, BigDecimal, 70368280578900]
- [-0.1e3, BigDecimal, 70368280577880]
- [-0.1e3, BigDecimal, 70368280577880] # -100 < 1,level 还是原来那个
- [-0.1e3, BigDecimal, 70368280577880]
复制代码
对原问题的解答,任何时候使用@level都是指的同一个变量。如果你要改成@level,就要改@level = XXX以及后面的get_exp(@level)
此外,下面写了self.exp=,为什么要加self,是因为如果不加self,exp=XXX就是对临时变量exp的赋值,但是加上self后就是调用函数 self.exp=(XXX)。 |
|