Project1

标题: 有关条件分歧的一些小问题。 [打印本页]

作者: 邱小谦    时间: 2015-4-22 22:38
标题: 有关条件分歧的一些小问题。
    # 添加物品
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        if $game_temp.in_battle
          if $data_items[i].occasion == 0 or $data_items[i].occasion == 1
           else
            next
          end
        end
        @data.push($data_items[i])
      end
    end
这段代码大神都知道什么意思了。我想请教一下。这里面的第二个分歧那里.in_battle后面没有声明是false或者是true的话。是默认为在$game_temp里面声明的那个false值么?如果在这里声明了,就是这里调用的值,对吧?

还有一个问题就是。。这里的条件分歧。第三个if后面紧接着else,这个地方该如何理解啊?是指满足前面3个条件后,到这里直接跳出,然后运行添加后面的物品么?
作者: RyanBern    时间: 2015-4-22 22:58
原则上,if 后面可以接任何表达式
后面的表达式的结果为 nil 或者 false,则 if 条件不成立,如果有 else 就落入 else 中,没有的话直接跳过。
例如:if $game_temp.in_battle
if 条件成立与否看$game_temp.in_battle当前的值,和声明时的没关系。
例如:
RUBY 代码复制
  1. a = 0
  2. if a
  3.   print "True"
  4. else
  5.   print "False"
  6. end
  7. # => "True"

感觉给出的代码的if判断越多,写代码的时候应该注意相同的分歧应该合并。
修改此处代码如下,用 unless 判断更方便
RUBY 代码复制
  1. for i in 1...$data_items.size
  2.   unless $game_party.item_number(i) == 0 || ($game_temp.in_battle && $data_items[i].occation > 1)
  3.     @data << $data_items[i]
  4.   end
  5. end

作者: 邱小谦    时间: 2015-4-22 23:39
RyanBern 发表于 2015-4-22 22:58
原则上,if 后面可以接任何表达式
后面的表达式的结果为 nil 或者 false,则 if 条件不成立,如果有 else  ...

谢谢你的回答。但是有一点我没明白。就是说。if后面一般不是得带表达式么?那样才会执行东西。这里的第三个if后面就是一个判断,后面直接是else,然后就进行下一次了。这个if...else之间没有语句啊。这个怎么判定?
作者: RyanBern    时间: 2015-4-23 08:17
本帖最后由 RyanBern 于 2015-4-23 08:20 编辑
邱小谦 发表于 2015-4-22 23:39
谢谢你的回答。但是有一点我没明白。就是说。if后面一般不是得带表达式么?那样才会执行东西。这里的第三 ...


if 后面接表达式指的是
RUBY 代码复制
  1. if $data_items[i].occasion == 0 or $data_items[i].occasion == 1

之后你说的“没有语句”,意思是如果此条件满足(即该物品使用场合为0或者1),那么就什么都不做。如果条件不满足,则直接进行下一次循环(这样会无视掉后面的@data.push(...))。
因此我说这样写的习惯不太好,这就相当于这种情况:
RUBY 代码复制
  1. a = true
  2. if a
  3.   print "True"
  4. else
  5. end
  6.  
  7. if a
  8.   print "True"
  9. end

什么都不做的分支应该省略此分支。这里应该用第二种写法。
因此,改成这样为好:
RUBY 代码复制
  1. if $data_items[i].occasion > 1
  2.   next
  3. end





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