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

Project1

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

[已经解决] 请教"return true" "return false" "return" 的区别

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
跳转到指定楼层
1
发表于 2019-12-28 15:31:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 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" 有什么区别呢?

多谢了!

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21599
在线时间
9411 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

8
发表于 2019-12-28 22:50:24 | 只看该作者
本帖最后由 喵呜喵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几年后你回来看自己写的老代码都在干什么时比起一大坨功能各异的代码全塞在一起要好理解一点……







评分

参与人数 2星屑 +100 +2 收起 理由
RyanBern + 100 + 1 认可答案
taeckle + 1 大神威武!

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
39587
在线时间
1920 小时
注册时间
2010-11-14
帖子
3320

R考场第七期纪念奖

7
发表于 2019-12-28 22:13: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?方法

评分

参与人数 2星屑 +50 +1 收起 理由
RyanBern + 50 认可答案
taeckle + 1 大神威武!明白了!

查看全部评分

用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
6
 楼主| 发表于 2019-12-28 22:11:25 | 只看该作者
soulsaga 发表于 2019-12-28 21:27
返回帶參数的话本方法就帶返回值..可以If等判断用

这么说return true 和 return false 都可以用 return 替代了是吗?

点评

返回还可以返回字符..返回数值..返回数组等..你觉得用一个返回怎么代替..  发表于 2019-12-28 22:16
不能..用途不同..  发表于 2019-12-28 22:15
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36367
在线时间
10781 小时
注册时间
2009-3-15
帖子
4813
5
发表于 2019-12-28 21:27:28 | 只看该作者

返回帶參数的话本方法就帶返回值..可以If等判断用
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
4
 楼主| 发表于 2019-12-28 18:14:41 | 只看该作者
喵呜喵5 发表于 2019-12-28 18:09
为了这么用

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

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

  def cant_evade?
    for i in @states
      if $data_states.cant_evade
        print('闪避成功')
      end
    end
      print('闪避失败')
  end

点评

不能,闪避成功后干的事情是调用 cant_evade? 的方法在做的,除非你的 cant_evade? 和它的调用者是一一对应的关系  发表于 2019-12-28 22:51
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21599
在线时间
9411 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

3
发表于 2019-12-28 18:09:35 | 只看该作者
为了这么用
  1. if can_evade?
  2.   print('闪避了')
  3. end
复制代码

return 用来返回函数的执行结果
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9163
在线时间
466 小时
注册时间
2015-5-8
帖子
866
2
 楼主| 发表于 2019-12-28 17:43:44 | 只看该作者
继续坐等大神!

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-10 23:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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