NoMethodEr-6ren">
gpt4 book ai didi

ruby - Ruby解析器的原理是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 08:49:21 26 4
gpt4 key购买 nike

我如何预测 Ruby 将如何解析事物?

在尝试连接字符串时,我在 Ruby 中遇到了一个非常令人惊讶的解析错误。

> "every".capitalize +"thing"
=> NoMethodError: undefined method `+@' for "thing":String

当然,如果您在它们中放置额外的空间,它会按预期工作;

> "every".capitalize + "thing"
=> "Everything"

如果我有 anything.any_method +"any string",就会发生这个错误。 Ruby 所做的是假定我们已经省略了括号,并试图为该方法提供一个参数;

"every".capitalize( +"thing" )

它注意到我们没有在字符串上定义一元运算符 +@,并抛出该错误。

我的问题是,我应该使用什么原则来预测 Ruby 解析器的行为?经过大量谷歌搜索后,我才发现这个错误。值得注意的是 .capitalize 从来没有采用任何参数(甚至在 C 源代码中也不采用)。如果您使用不适用于前一个对象的方法,它仍然会抛出 +@ 错误,而不是 undefined method 'capitalize' for "every":String错误。所以这个解析显然是高级的。我的知识不足以阅读 Matz 的 parser.y .我遇到过其他类似的令人惊讶的错误。谁能告诉我 Ruby 的解析优先级?

最佳答案

如果你想看看 ruby​​ 是如何解析你的代码的,你可以转储解析树,即

ruby -e '"every".capitalize +"thing"' --dump 解析树

# @ NODE_SCOPE (line: 1)
# +- nd_tbl: (empty)
# +- nd_args:
# | (null node)
# +- nd_body:
# @ NODE_CALL (line: 1)
# +- nd_mid: :capitalize
# +- nd_recv:
# | @ NODE_STR (line: 1)
# | +- nd_lit: "every"
# +- nd_args:
# @ NODE_ARRAY (line: 1)
# +- nd_alen: 1
# +- nd_head:
# | @ NODE_CALL (line: 1)
# | +- nd_mid: :+@
# | +- nd_recv:
# | | @ NODE_STR (line: 1)
# | | +- nd_lit: "thing"
# | +- nd_args:
# | (null node)
# +- nd_next:
# (null node)

我喜欢用explainruby有时也是,因为它对我的眼睛来说更容易 :)

关于ruby - Ruby解析器的原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17285747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com