嵌套的if语句不评估运算结果

时间:2018-11-29 17:25:06

标签: ruby

我正在临时目录中生成一个文件。 如果要生成的文件与现有文件不同,那么我将不更新它并运行命令。如果相同的话,我什么也做不了。

我的代码如下:

errstatus = 0
if FileUtils.identical?('/var/tmp/newfile', '/var/tmp/originalfile')
  $stderr.puts "Files are the same, nothing to do"
else
  $stderr.puts "Files are different, let's update them."

  if FileUtils.cp_r '/var/tmp/newfile', '/var/tmp/originalfile'
    $stderr.puts "File copied successfully."

    if system('systemcommand1 here')
      $stderr.puts "command ran OK"

      if system('systemcommand2 here')
        $stderr.puts "next command ran ok"

      else
        $stderr.puts "command 2 failed"
        errstatus = 1
      end
    else
      $stderr.puts "command 1 failed"
      errstatus = 1
    end
  end
end

在文件不同的情况下运行它时,我得到输出:

Files are different, let's update them.

它以FileUtils.cp_r运行,没有任何错误,但是并不能说明文件已成功复制,还是运行系统命令。我使用了相同的语法来评估FileUtils.identical?,但不适用于FileUtils.cp_r

我在哪里错了?

2 个答案:

答案 0 :(得分:5)

如果复制成功,

FileUtils::cp_r返回nil(在Ruby中是虚假的),否则返回错误。它永远不会返回真实值,因此使其成为条件是没有意义的。

由于它现在没有else语句,因此只需删除其前面的if。如果您想为cp_r处理错误,则需要将其包装到begin..rescue块中。

答案 1 :(得分:0)

也许是因为if FileUtils.cp_r '/var/tmp/newfile', '/var/tmp/originalfile'没有else子句,所以如果它返回false或抛出并抛出异常,则不会输入if。