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当前的值,和声明时的没关系。 
例如: 
a = 0 
if  a
  print  "True" 
else 
  print  "False" 
end 
# => "True" 
a = 0 
 
if  a
 
  print  "True" 
 
else 
 
  print  "False" 
 
end 
 
# => "True" 
 
 
感觉给出的代码的if判断越多,写代码的时候应该注意相同的分歧应该合并。 
修改此处代码如下,用 unless 判断更方便 
for  i in  1 ...$data_items.size 
  unless  $game_party .item_number ( i)  == 0  || ( $game_temp.in_battle  && $data_items [ i] .occation  > 1 ) 
    @data  << $data_items [ i] 
  end 
end 
for  i in  1 ...$data_items.size 
 
  unless  $game_party .item_number ( i)  == 0  || ( $game_temp.in_battle  && $data_items [ i] .occation  > 1 ) 
 
    @data  << $data_items [ i] 
 
  end 
 
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 后面接表达式指的是 
if  $data_items [ i] .occasion  == 0  or  $data_items [ i] .occasion  == 1 
if  $data_items [ i] .occasion  == 0  or  $data_items [ i] .occasion  == 1 
 
 
之后你说的“没有语句”,意思是如果此条件满足(即该物品使用场合为0或者1),那么就什么都不做。如果条件不满足,则直接进行下一次循环(这样会无视掉后面的@data.push(...))。 
因此我说这样写的习惯不太好,这就相当于这种情况: 
a = true 
if  a
  print  "True" 
else 
end 
 
if  a
  print  "True" 
end 
a = true 
 
if  a
 
  print  "True" 
 
else 
 
end 
 
 
 
if  a
 
  print  "True" 
 
end 
 
 
什么都不做的分支应该省略此分支。这里应该用第二种写法。 
因此,改成这样为好: 
if  $data_items [ i] .occasion  > 1 
  next 
end 
if  $data_items [ i] .occasion  > 1 
 
  next 
 
end 
 
 
 
欢迎光临 Project1 (https://rpg.blue/) 
Powered by Discuz! X3.1