早上好,
我开始使用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的新手。
答案 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)
,或者,如果您喜欢否定,!=
。