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

Project1

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

[已经过期] 请问:为什么是level不是@level

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
跳转到指定楼层
1
发表于 2021-8-18 15:17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  #--------------------------------------------------------------------------
  # ● 更改水品
  #     level : 新的等级
  #--------------------------------------------------------------------------
  def level=(level)
    # 检查上下限
    level = [[level, $data_actors[@actor_id].final_level].min, 1].max
    # 更改 EXP
    self.exp = @exp_list[level]
  end
我把level改成@level后,等级到最大等级(我设定为5),然后再加等级,等级居然可以变化为其他等级,如果我不把level改成@level,就不会出现这样的情况。我想问:level到底是什么意思,为什么不是@level而是level?

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

2
发表于 2021-8-18 15:35:31 | 只看该作者
这么多的level你改了哪一个?而且这段代码真的没问题吗……感觉没设置@level吧
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
3
发表于 2021-8-18 15:52:35 | 只看该作者
def level=(level)
    # 检查上下限
    level = [[level, $data_actors[@actor_id].final_level].min, 1].max
    # 更改 EXP
    self.exp = @exp_list[level]
  end

这里的level对应的都是参数中的level,真正修改@level的地方要是没记错应该是def exp。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

4
发表于 2021-8-18 16:06:07 | 只看该作者
本帖最后由 guoxiaomi 于 2021-8-18 16:21 编辑
enghao_lim 发表于 2021-8-18 15:52
def level=(level)
    # 检查上下限
    level = [[level, $data_actors[@actor_id].final_level].min, 1] ...


不完全是这样,如果等级越界,level = 后面的内容计算出来了一个整数:比如level = 0 就是新建了一个全新的临时变量level,并且赋值为 0;但是如果等级没有越界,实际执行了 level = level,就会什么都不发生,本行跳过。此时如你所说的,出现的level都是传入的那个。
可以看下面的测试代码和结果。由于ruby里整数是即时值,所以我把一个BigDecimal对象传进来:
  1. require 'bigdecimal'
  2. class A
  3.   def level=(level)
  4.     p [level, level.class, level.object_id]
  5.     level = [level, BigDecimal('1')].min
  6.     p [level, level.class, level.object_id]
  7.     get_level(level)
  8.   end

  9.   def get_level(level)
  10.     p [level, level.class, level.object_id]
  11.   end
  12. end

  13. a = A.new
  14. a.level = BigDecimal('100')
  15. a.level = BigDecimal('-100')
复制代码
输出是:
  1. [0.1e3, BigDecimal, 70368280579580]
  2. [0.1e1, BigDecimal, 70368280578900] # 100 > 1,level 是新创建的临时变量
  3. [0.1e1, BigDecimal, 70368280578900]
  4. [-0.1e3, BigDecimal, 70368280577880]
  5. [-0.1e3, BigDecimal, 70368280577880] # -100 < 1,level 还是原来那个
  6. [-0.1e3, BigDecimal, 70368280577880]
复制代码


对原问题的解答,任何时候使用@level都是指的同一个变量。如果你要改成@level,就要改@level = XXX以及后面的get_exp(@level)

此外,下面写了self.exp=,为什么要加self,是因为如果不加self,exp=XXX就是对临时变量exp的赋值,但是加上self后就是调用函数 self.exp=(XXX)。

点评

知识太高深。理解不了,能简单说下吗?  发表于 2021-8-21 16:10
啊我就是闲得无聊来找茬  发表于 2021-8-19 00:58
0 != 0  发表于 2021-8-18 21:18
Erm...太过细节了,如果要考虑对象就会出现0 = 0的情况,我不确定LZ是否可以理解,但是把参考系列出来应该相对容易理解的。  发表于 2021-8-18 21:16
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
5
 楼主| 发表于 2021-8-21 16:13:27 | 只看该作者

def level=(level)
     # 检查上下限
      level = [[level, $data_actors[@actor_id].final_level].min, 1].max
     # 更改 EXP
     self.exp = @exp_list[level]
   end
我想问的是:方法level = 下面的level到底是方法还是变量?

点评

应该是变量  发表于 2021-8-21 20:44
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
6
发表于 2021-8-21 21:04:56 | 只看该作者
def level=(level)
level 函数(方法)
level 参数(也可以理解为变量,在某种意义上……)
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

7
发表于 2021-8-22 08:51:03 | 只看该作者
因为RM控制初期等级和终末等级依赖的是经验表而不是等级的字面数字啊
当时发现等级降低可以超出初期等级限制的bug就是发现这句写错了
level = [[level, $data_actors[@actor_id].final_level].min, 1].max
这句中的1应该改成$data_actors[@actor_id].initial_level才正确
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 09:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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