在纯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的解析器已损坏。(实际上,您遇到的错误已在几个月前报告:错误#12177:在irb控制台中使用if:
具有新哈希语法的哈希符号作为符号不起作用。)只需忽略它即可。IRb和Ruby在行为上还存在其他差异,即语义上的差异,而不仅仅是语法上的差异。例如,在顶层定义的方法是隐式的,public
而不是private
应有的隐式方法。
IRb尝试使用其自己的解析器来解析代码以弄清楚,例如,是否在您点击时将其提交给引擎,ENTER还是在下一行等待您继续执行代码。但是,由于Ruby的语法非常复杂,因此很难正确地对其进行解析,并且众所周知IRb的解析器与Ruby的解析器有所不同。
其他REPL采用不同的方法,例如Pry实际上使用Ruby的解析器而不是其自身的解析器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句