ruby 1.8 和 ruby 2.1 的向后兼容代码不适用于文件模块

backward-compatibily code for ruby 1.8 and ruby 2.1 not working on File module

我需要在 ruby 1.8 和 ruby 2.1 上写一些需要 运行 的代码,特别是用 UTF-8 编码打开一个文件,所以我天真地写了

if RUBY_VERSION > "1.9"
  f = File.open('/usr/share/hwdata/pci.ids', encoding: "utf-8")
else
  f = File.open('/usr/share/hwdata/pci.ids')
end

虽然它适用于 ruby 2.1,ruby 1.8 运行s 代码它不应该 运行 和 returns 这个错误

test_ruby_version.rb:8: syntax error, unexpected ':', expecting ')'
  f = File.open('/usr/share/hwdata/pci.ids', encoding: "utf-8")
                                                      ^
test_ruby_version.rb:8: syntax error, unexpected ')', expecting kEND

我做了一些基本的布尔测试,这样它就可以正常工作了

if RUBY_VERSION > "1.9"
  puts "this is displayed when running ruby 2"
end
if RUBY_VERSION < "2.0"
  puts "this is displayed when running ruby 1.9 or less"
end
if RUBY_VERSION < "1.8"
  puts "this is displayed when running ruby 1.7 or less"
end

有人可以向我解释这个问题以及如何解决吗?

谢谢

代码在执行前解析,整体解析,即使是死代码也不允许出现语法错误。

您的问题的解决方案是对哈希使用旧语法,因此您的代码应如下所示:

if RUBY_VERSION > "1.9"
  f = File.open('/usr/share/hwdata/pci.ids', :encoding => "utf-8")
else
  f = File.open('/usr/share/hwdata/pci.ids')
end