在纯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/