Ruby cmd 行脚本非连续执行代码

Ruby cmd line script executes code non-consecutively

我已经构建了一个 ruby 脚本,它应该在终端中 运行。

$ ruby script.rb

我有一些特定于新版本 ruby 的代码,所以我在页面顶部添加了 ruby 版本检查:

abort("You're using ruby #{RUBY_VERSION}. Please use version 2.1 or newer") if (RUBY_VERSION.to_f < 2.1)

我仔细检查了 irb 中的代码行,似乎在通过 RVM 更改 ruby 版本时有效。

但是,当我 运行 下的 ruby 脚本文件时,比如 ruby 1.8.7,脚本爆炸并出现以下错误:

$ ruby script.rb 
script.rb:6: odd number list for Hash
option1:            'some options',
        ^
script.rb:6: syntax error, unexpected ':', expecting '}'
option1:            'some options',
        ^
script.rb:6: syntax error, unexpected ',', expecting $end

如果我没有在文件顶部进行版本检查,这将是预期的行为。

为什么不在下一行代码之前执行版本检查?有没有办法在继续执行其余代码之前强制执行 ruby 检查?

我的完整文件是:

#!/usr/bin/env ruby

abort("You're using ruby #{RUBY_VERSION}. Please use version 2.1 or newer") if (RUBY_VERSION.to_f < 2.1)

options = {
    option1: 'some options',
    option2: 'some more options',
    option3: 'other options'
}

该错误出现在 ruby 解析器上。在 ruby 1.8.7 中,带有符号的哈希必须用 hashrockets { :option => 'some options'} 编写,因为 shorthand { option: '' } 仅在 ruby 1.9

中引入

为了更好地解释它,ruby 必须在对文件执行任何操作之前解析整个文件。所以你的版本检查不会被执行,因为你的文件有无效的 ruby 1.8 语法。