在纯Ruby irb中,不能输入{if: 1}。该语句不会终止,因为irb认为if不是符号,而是if语句的开头。

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

class Order < ApplicationRecord
  before_save :normalize_card_number, if: :paid_with_card?
end
unless也发生了同样的事情。

最佳答案

众所周知,IRb的解析器已损坏。 (实际上,您遇到的错误已经在几个月前报告过:Bug #12177: Using if: as symbol in hash with new hash syntax in irb console is not working。)只需忽略它。 IRb和Ruby在行为上还存在其他差异,即语义上的差异,而不仅仅是语法上的差异。例如。在顶层定义的方法是隐式的public而不是应有的隐式private

IRb尝试使用其自己的解析器解析代码以找出例如是在您按ENTER键时将其提交给引擎,还是在下一行等待您继续执行代码。但是,由于Ruby的语法极其复杂,因此很难正确地对其进行解析,并且众所周知IRb的解析器与Ruby的解析器有所不同。

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

关于ruby-on-rails - 为什么Rails可以使用 `if`作为哈希键,但是不能在Ruby中使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39269032/

10-11 20:06
查看更多