Ruby命令行脚本不连续执行代码

标签 ruby terminal

我已经构建了一个应该在终端中运行的 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​​ 1.8.7 下运行 ruby​​ 脚本文件时,脚本会崩溃并出现以下错误:

$ 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'} 编写,因为简写 { option: '' } 仅在 ruby 1.9

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

关于Ruby命令行脚本不连续执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063325/

相关文章:

ruby-on-rails - 在 Rails 中以毫秒为单位存储时间

C - 使用 ncurses 获取中性背景

由于与 mariadb 冲突,MySQL 无法在 CentOS 中安装

reactjs - 使用单个 shell 脚本运行 React 和 Flask

arrays - 运行 Ruby 冒泡排序

ruby - 获取 ruby​​ 函数对象本身

linux - 保存和恢复终端内容

terminal - 杀死 Mavericks 上端口 8080 上运行的所有进程

ruby-on-rails - 在 Flash 警报 Rails 3 中显示错误消息

javascript - 如何为用 Ruby 编码的网站自动化测试驱动开发 (TDD) 语法?