Ruby if / else flow

时间:2017-01-21 21:37:07

标签: ruby

早上好,

我开始使用Ruby,想要创建一个小工具来获取我的公共IP并通过电子邮件发送它。我遇到了一个字符串比较的基本问题,以及一个不会处理的if / else块。

代码非常简单(见下文)。第21行的字符串比较出现了问题。我想要的是,每当IP地址从文件中记录的内容发生变化时,新IP将覆盖文件中的IP地址和其他操作(不在当前代码中)随之而来。

看起来有时比较没有执行,因此if后面的语句不执行。

我想明白为什么会这样。对于if(!oldIP == ip)if(oldIP!= ip),第21行有时会被更改,结果相同。我还怀疑有时会忽略返回值(死代码路径?)。

这是代码

#!/usr/bin/env ruby

require "net/http"

puts "\e[H\e[2J"

def FetchIPAddress()
  oldIP = ""
  if File::exists?('/tmp/wanipaddress.txt')
    iFile = File.open('/tmp/wanipaddress.txt')
    oldIP = iFile.read()
    iFile.close()
  end

  oFile = File.open('/tmp/wanipaddress.txt', "w+")
  ip =  Net::HTTP.get(URI("https://api.ipify.org"))

  puts "old = " + oldIP
  puts "new = " + ip

  if (!oldIP == ip)
    puts "changed"
    oFile.puts ip
    oFile.close()
  else
    ip = "unchanged"
    puts "unchanged"
  end
  return ip
end

真的,我确实在这看到一些不稳定的行为;我怀疑这只是我与Ruby的新手。

2 个答案:

答案 0 :(得分:2)

您的文件可能包含换行符。

试试这个

if oldIP != ip

if !(oldIP == ip)删除了一个尾随换行符。

最好使用if old_ip.chomp != ip.chomp ... end 来打印调试值,这将转义空格,从而使尾随换行符可见。您永远不应该使用chomp进行调试。

这就是为什么p永远不会起作用的原因。

puts!a == b相同,执行如下

  • 首先在对象!a == b上调用a.!().==(b)方法,该方法为字符串返回!
  • 然后在结果布尔值
  • 上调用a方法
  • 由于布尔值永远不等于字符串,因此比较将始终失败

答案 1 :(得分:1)

此行(if (!oldIP == ip))的问题非常简单 - 您希望它检查旧IP是否与新IP不同。
你做的是取oldIP,检查它是真还是假,然后否定它(那是!的作用),然后将它与{{1}进行比较}。由于ip是一个字符串,因此总是为真,它被否定为假,oldIP是(我猜测)一个字符串,它总是为真,你的行基本上是{ {1}}。

要解决此问题,您可以使用ip比较运算符,例如if (false == true),或者,如果您喜欢否定,!=