【问题标题】:Ruby curly bracket block syntax is not working while do...end worksRuby 花括号块语法在 do...end 工作时不起作用
【发布时间】:2018-06-21 14:23:44
【问题描述】:

我正在使用this gem。当我使用以下语法时,它可以正常工作:

every :day do
  rake 'billing:daily'
end

但是,当我使用以下语法时,gem 给出了语法错误:

every :day { rake 'billing:daily' }

输出:

~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/job_list.rb:25:in `instance_eval': config/schedule.rb:26: syntax error, unexpected '{', expecting end-of-input (SyntaxError)
every :day { rake 'billing:daily' }
            ^
    from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/job_list.rb:25:in `initialize'
    from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever.rb:12:in `new'
    from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever.rb:12:in `cron'
    from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/command_line.rb:42:in `run'
    from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/lib/whenever/command_line.rb:6:in `execute'
    from ~/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/whenever-0.10.0/bin/whenever:44:in `<top (required)>'
    from ~/.rbenv/versions/2.4.3/bin/whenever:23:in `load'
    from ~/.rbenv/versions/2.4.3/bin/whenever:23:in `<main>'

两者不是一回事吗?为什么前者有效,后者无效?

【问题讨论】:

标签: ruby whenever


【解决方案1】:

这是一个解析/优先级问题。大括号尝试绑定到最近的标记,在本例中为:day,但您希望它绑定到every()。您必须编写 every(:day) { rake 'billing:daily' } 才能将其显式绑定到正确的令牌。

【讨论】:

    【解决方案2】:

    在 ruby​​ 中 2.4.2 was introduced regression 在块解析中。在 ruby​​ 2.4.1 中,您可以使用:

    every :day { rake 'billing:daily' }
    
    

    在 ruby​​ 2.4.2 中,如果您使用块调用它,则必须将函数参数括在括号中,否则您将得到 SyntaxError

    every(:day) { rake 'billing:daily' }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2011-07-27
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多