为什么Rails可以使用`if`作为哈希键而不是Ruby

lul*_*ala 5 ruby ruby-on-rails

在纯Ruby irb中,无法输入{if: 1}.声明不会终止,因为irb认为if不是符号,而是if语句的开头.

那么为什么Rails可以before_filter接受if作为参数呢?该指南的代码如下:

class Order < ApplicationRecord
  before_save :normalize_card_number, if: :paid_with_card?
end
Run Code Online (Sandbox Code Playgroud)

同样的事情也发生了unless.

fl0*_*00r 7

这是一个问题,而不是Ruby.

bash=> ruby -e "puts({if: 1})"
bash=# {:if=>1}
Run Code Online (Sandbox Code Playgroud)

你可以pry改用.它会正确读取输入.

https://github.com/pry/pry


Jör*_*tag 4

众所周知,IRb 的解析器是有问题的。(事实上​​,您遇到的错误已经在几个月前报告过:Bug #12177:在 irb 控制台中使用if:新哈希语法作为哈希符号不起作用。)忽略它即可。IRb 和 Ruby 之间还存在其他行为差异,语义差异,而不仅仅是语法差异。例如,在顶层定义的方法是隐式的,public而不是private应有的隐式的。

IRb 尝试使用自己的解析器解析代码来确定,例如,当您点击ENTER或等待下一行继续代码时是否将其提交给引擎。然而,由于 Ruby 的语法极其复杂,因此很难正确解析它,并且众所周知 IRb 的解析器与 Ruby 的解析器有所不同。

其他 REPL 采用不同的方法,例如Pry实际上使用 Ruby 的解析器而不是它自己的。