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.
这是一个问题,而不是Ruby.
bash=> ruby -e "puts({if: 1})"
bash=# {:if=>1}
Run Code Online (Sandbox Code Playgroud)
你可以pry改用.它会正确读取输入.
众所周知,IRb 的解析器是有问题的。(事实上,您遇到的错误已经在几个月前报告过:Bug #12177:在 irb 控制台中使用if:新哈希语法作为哈希符号不起作用。)忽略它即可。IRb 和 Ruby 之间还存在其他行为差异,语义差异,而不仅仅是语法差异。例如,在顶层定义的方法是隐式的,public而不是private应有的隐式的。
IRb 尝试使用自己的解析器解析代码来确定,例如,当您点击ENTER或等待下一行继续代码时是否将其提交给引擎。然而,由于 Ruby 的语法极其复杂,因此很难正确解析它,并且众所周知 IRb 的解析器与 Ruby 的解析器有所不同。
其他 REPL 采用不同的方法,例如Pry实际上使用 Ruby 的解析器而不是它自己的。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |