Project1

标题: 请问:为什么是level不是@level [打印本页]

作者: kvkv97    时间: 2021-8-18 15:17
标题: 请问:为什么是level不是@level
  #--------------------------------------------------------------------------
  # ● 更改水品
  #     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?
作者: guoxiaomi    时间: 2021-8-18 15:35
这么多的level你改了哪一个?而且这段代码真的没问题吗……感觉没设置@level吧
作者: enghao_lim    时间: 2021-8-18 15:52
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。
作者: guoxiaomi    时间: 2021-8-18 16:06
本帖最后由 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)。
作者: kvkv97    时间: 2021-8-21 16:13

def level=(level)
     # 检查上下限
      level = [[level, $data_actors[@actor_id].final_level].min, 1].max
     # 更改 EXP
     self.exp = @exp_list[level]
   end
我想问的是:方法level = 下面的level到底是方法还是变量?
作者: enghao_lim    时间: 2021-8-21 21:04
def level=(level)
level 函数(方法)
level 参数(也可以理解为变量,在某种意义上……)
作者: SailCat    时间: 2021-8-22 08:51
因为RM控制初期等级和终末等级依赖的是经验表而不是等级的字面数字啊
当时发现等级降低可以超出初期等级限制的bug就是发现这句写错了
level = [[level, $data_actors[@actor_id].final_level].min, 1].max
这句中的1应该改成$data_actors[@actor_id].initial_level才正确





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1