Project1

标题: 请教"return true" "return false" "return" 的区别 [打印本页]

作者: taeckle    时间: 2019-12-28 15:31
标题: 请教"return true" "return false" "return" 的区别
本帖最后由 taeckle 于 2019-12-28 17:44 编辑

经常在各种脚本里看到"return true" "return false" "return" , return应该是"返回(上一个层面)+中断(这一def的计算)"的意思

特地开一贴,想请大神们分享一下自己对"return true" 和"return false" 指令作用和意义的理解,这里有个默认脚本里判断是否可以回避攻击的例子:

  # ● 判断状态 [无法回避攻击]
  #--------------------------------------------------------------------------
  def cant_evade?
    for i in @states
      if $data_states.cant_evade
        return true
      end
    end
    return false
  end
  #--------------------------------------------------------------------------


请问这个例子里的 "return true"  和 "return false" 有什么区别呢?

多谢了!


作者: taeckle    时间: 2019-12-28 17:43
继续坐等大神!


作者: 喵呜喵5    时间: 2019-12-28 18:09
为了这么用
  1. if can_evade?
  2.   print('闪避了')
  3. end
复制代码

return 用来返回函数的执行结果
作者: taeckle    时间: 2019-12-28 18:14
喵呜喵5 发表于 2019-12-28 18:09
为了这么用

return 用来返回函数的执行结果

大神那上面这个闪避例子可否这么写呢:

  def cant_evade?
    for i in @states
      if $data_states.cant_evade
        print('闪避成功')
      end
    end
      print('闪避失败')
  end
作者: soulsaga    时间: 2019-12-28 21:27
taeckle 发表于 2019-12-28 17:43
继续坐等大神!

返回帶參数的话本方法就帶返回值..可以If等判断用
作者: taeckle    时间: 2019-12-28 22:11
soulsaga 发表于 2019-12-28 21:27
返回帶參数的话本方法就帶返回值..可以If等判断用

这么说return true 和 return false 都可以用 return 替代了是吗?
作者: KB.Driver    时间: 2019-12-28 22:13
本帖最后由 KB.Driver 于 2020-1-5 09:57 编辑

简单来说,这是做一个any?的遍历
先对所有状态都判断,也就是for i in @states
然后只要有一个状态是“无法回避”,那么这个角色就会“无法回避”,所以
if $data_states.cant_evade # 这里是不是应该用 if $data_states[ i].cant_evade
  return true
end
剩下的状态就不需要判断了,这就是return在这里的作用。
只有所有状态都不含“无法回避”,才能下结论“不是无法回避”,所以在最后return false

最后简单说下,true false都是“布尔值”,分别代表真与假
如果return 后面不跟东西,就会返回nil,代表空值。
空值在if语句中的行为与false相同,如果要区分false与nil可以在对象上调用nil?方法
作者: 喵呜喵5    时间: 2019-12-28 22:50
本帖最后由 喵呜喵5 于 2019-12-28 22:58 编辑
taeckle 发表于 2019-12-28 18:14
大神那上面这个闪避例子可否这么写呢:

  def cant_evade?


如果你这个闪避的判断只会用在一个地方,并且你这个闪避的逻辑非常简单,日后也不考虑扩展的话,你这么写也可以
什么意思呢,比如你现在有游戏里有两个方法,一个是魔法攻击,一个是物理攻击,两个地方都有判定闪避,这里有两种写法,

写法1是把闪避抽成一个方法:

  1. def 闪避?
  2.   if BALABALA 500 行判断
  3.     return true
  4.   else
  5.     return false
  6.   end
  7. end
  8. def 魔法攻击
  9.   if 闪避?
  10.     啥都不做
  11.   else
  12.     造成伤害
  13.   end
  14. end
  15. def 物理攻击
  16.   if 闪避?
  17.     啥都不做
  18.   else
  19.     造成伤害
  20.   end
  21. end
复制代码


写法2是把每个地方都完整的写一遍闪避的判断:

  1. def 魔法攻击
  2.   if BALABALA 500 行判断
  3.     啥都不做
  4.   else
  5.     造成伤害
  6.   end
  7. end
  8. def 物理攻击
  9.   if BALABALA 500 行判断
  10.     啥都不做
  11.   else
  12.     造成伤害
  13.   end
  14. end
复制代码


现在扩展开来看这个写法2,假设有10个地方都要判定闪避,写法2的代码就变成了这样:

  1. def 攻击1
  2.   if BALABALA 500 行判断
  3.     啥都不做
  4.   else
  5.     造成伤害
  6.   end
  7. end
  8. def 攻击2
  9.   if BALABALA 500 行判断
  10.     啥都不做
  11.   else
  12.     造成伤害
  13.   end
  14. end
  15. def 攻击3
  16.   if BALABALA 500 行判断
  17.     啥都不做
  18.   else
  19.     造成伤害
  20.   end
  21. end
  22. def 攻击4
  23.   if BALABALA 500 行判断
  24.     啥都不做
  25.   else
  26.     造成伤害
  27.   end
  28. end
  29. def 攻击5
  30.   if BALABALA 500 行判断
  31.     啥都不做
  32.   else
  33.     造成伤害
  34.   end
  35. end
  36. def 攻击6
  37.   if BALABALA 500 行判断
  38.     啥都不做
  39.   else
  40.     造成伤害
  41.   end
  42. end
  43. def 攻击7
  44.   if BALABALA 500 行判断
  45.     啥都不做
  46.   else
  47.     造成伤害
  48.   end
  49. end
  50. def 攻击8
  51.   if BALABALAA 500 行判断
  52.     啥都不做
  53.   else
  54.     造成伤害
  55.   end
  56. end
  57. def 攻击9
  58.   if BALABALA 500 行判断
  59.     啥都不做
  60.   else
  61.     造成伤害
  62.   end
  63. end
  64. def 攻击10
  65.   if BALABALA 500 行判断
  66.     啥都不做
  67.   else
  68.     造成伤害
  69.   end
  70. end
复制代码


你在这10个地方都要写一遍这 BALABALA 500 行判断,哪个地方写错了那个地方都会出 bug,比如你看我上面的攻击8,BALABALA 后面手滑多敲了一个A,这个攻击8的逻辑就出bug了
好不容易你把这 BALABALA 500 行全都写到对应的位置了,你发现代码逻辑有问题,不应该是 BALABALA 500 行判断,而应该是 BALABALA 501 行判断,对于写法1来说,代码只是变成了

  1. def 闪避?
  2.   if BALABALA 501 行判断
  3.     return true
  4.   else
  5.     return false
  6.   end
  7. end
复制代码


其他地方都不需要改,对于写法2就厉害了

  1. def 攻击1
  2.   if BALABALA 501 行判断
  3.     啥都不做
  4.   else
  5.     造成伤害
  6.   end
  7. end
  8. def 攻击2
  9.   if BALABALA 501 行判断
  10.     啥都不做
  11.   else
  12.     造成伤害
  13.   end
  14. end
  15. def 攻击3
  16.   if BALABALA 501 行判断
  17.     啥都不做
  18.   else
  19.     造成伤害
  20.   end
  21. end
  22. def 攻击4
  23.   if BALABALA 500 行判断
  24.     啥都不做
  25.   else
  26.     造成伤害
  27.   end
  28. end
  29. def 攻击5
  30.   if BALABALA 501 行判断
  31.     啥都不做
  32.   else
  33.     造成伤害
  34.   end
  35. end
  36. def 攻击6
  37.   if BALABALA 501 行判断
  38.     啥都不做
  39.   else
  40.     造成伤害
  41.   end
  42. end
  43. def 攻击7
  44.   if BALABALA 501 行判断
  45.     啥都不做
  46.   else
  47.     造成伤害
  48.   end
  49. end
  50. def 攻击8
  51.   if BALABALA 501 行判断
  52.     啥都不做
  53.   else
  54.     造成伤害
  55.   end
  56. end
  57. def 攻击9
  58.   if BALABALA 501 行判断
  59.     啥都不做
  60.   else
  61.     造成伤害
  62.   end
  63. end
  64. def 攻击10
  65.   if BALABALA 501 行判断
  66.     啥都不做
  67.   else
  68.     造成伤害
  69.   end
  70. end
复制代码


这 10 个地方又都要挨个改一遍,哪个地方漏改了都会出 bug,比如你看这上面的代码,攻击4我就漏改了,还是BALABALA 500行,实际游戏里攻击4就出 bug 了



综上,从功能上来看,写法1和写法2是没有差别的,写法1的目的是让同样的代码只写一遍,这样用到这个代码的地方不容易漏掉什么东西,代码出了bug那改一个地方所有地方也能一起被修正了。反过来来说,如果代码本来就只用在唯一的一个地方,那就没有上述的那些问题,写法1和写法2实际上差别不大,硬要说的话,就是写法1几年后你回来看自己写的老代码都在干什么时比起一大坨功能各异的代码全塞在一起要好理解一点……












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