Ruby 大括号块语法在 do...end 时不起作用
Ruby curly bracket block syntax is not working while do...end works
我正在使用 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>'
两者不是一回事吗?为什么前者有效而后者无效?
这是一个 parsing/precedence 问题。大括号尝试绑定到最近的标记,在本例中为 :day
,但您希望它绑定到 every()
。您必须编写 every(:day) { rake 'billing:daily' }
以将其显式绑定到正确的令牌。
在ruby2.4.2
was introduced regression块解析中。在 ruby 2.4.1
中,您可以使用:
every :day { rake 'billing:daily' }
in ruby 2.4.2
如果用块调用函数参数,则必须将函数参数括在括号中,否则会得到 SyntaxError
:
every(:day) { rake 'billing:daily' }
我正在使用 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>'
两者不是一回事吗?为什么前者有效而后者无效?
这是一个 parsing/precedence 问题。大括号尝试绑定到最近的标记,在本例中为 :day
,但您希望它绑定到 every()
。您必须编写 every(:day) { rake 'billing:daily' }
以将其显式绑定到正确的令牌。
在ruby2.4.2
was introduced regression块解析中。在 ruby 2.4.1
中,您可以使用:
every :day { rake 'billing:daily' }
in ruby 2.4.2
如果用块调用函数参数,则必须将函数参数括在括号中,否则会得到 SyntaxError
:
every(:day) { rake 'billing:daily' }