Ruby中的字符串比较不起作用

时间:2012-12-09 20:54:25

标签: ruby sqlite

我不确定这里发生了什么。我需要在两个变量Times上运行字符串比较。一个变量是使用.mtime函数的Time对象。另一个变量取自sqlite3数据库。我想比较这些时间,看看修改日期是否与sqlite3表中列出的最后修改日期不同。这是该部分的代码。

当我打印出它们看起来相同的值时...那么为什么比较不起作用

def scanfile
  dir = Dir.new(Dir.pwd)
  dir.each do |file|
    fileName = File.basename(file)
    modTime = File.mtime(file).strftime("%F %T")
    lastMod = nil
    exists = checkDB(fileName)
    if exists == true
      $db.execute("SELECT DateMod FROM Files WHERE fileName = '#{fileName}'") do |mod|
        lastMod = mod
      end
      mod = modTime.to_s

      printf("modTime: #{mod} lastMod: #{lastMod}\n")
      if mod != lastMod
        $db.execute("UPDATE Files SET NumMods=NumMods+1 WHERE fileName = '#{fileName}'")
        $db.execute("UPDATE Files SET DateMod='#{modTime}' WHERE fileName = '#{fileName}'")
        print "#{fileName} updated...\n"
      end
    else
      if fileName != "." && fileName != ".."    
        inputRecord(fileName, modTime, modTime, 1)
        print "#{fileName} inserted...\n"
      end
    end
  end
end

2 个答案:

答案 0 :(得分:1)

当您使用execute(或this version)时,您将使用结果集的行作为字符串数组,而不是简单的字符串。所以在这里:

$db.execute(...) do |mod|
  #...
end

您的mod将是一个包含单个字符串的数组。问题是你要保存该数组并将其视为字符串;通过足够的to_s调用和类似的修改,你将得到一个对你和Ruby都一致的字符串,一切都会正常工作。

您应该自己解压缩行数组:

$db.execute(...) do |mod|
  lastMod = mod.first
  # ------------^^^^^
end

答案 1 :(得分:0)

好吧我明白了。我不确定为什么要修复它,因为我认为我基本上是这样做但是使用:

if !modTime.to_s.eql? lastMod.to_s

运作良好..