ruby - Ruby 的 AST 中的 'send' 关键字是什么意思?

标签 ruby parsing abstract-syntax-tree s-expression ruby-ripper

我正在尝试学习 Ruby 词法分析器和解析器 ( whitequark parser ) 以了解更多有关从 Ruby 脚本进一步生成机器代码的过程。

在解析以下 Ruby 代码字符串时。

def add(a, b)
    return a + b
end

puts add 1, 2

它导致以下 S 表达式符号。

s(:begin,
    s(:def, :add,
        s(:args,
            s(:arg, :a),
            s(:arg, :b)),
        s(:return,
            s(:send,
                s(:lvar, :a), :+,
                s(:lvar, :b)))),
    s(:send, nil, :puts,
        s(:send, nil, :add,
            s(:int, 1),
            s(:int, 3))))

任何人都可以向我解释生成的 S 表达式符号中 :send 关键字的定义吗?

最佳答案

Ruby 建立在“一切皆对象”范式之上。也就是说,包括数字在内的一切都是对象。

操作符,正如我们在普通 ruby​​ 代码中看到的那样,只不过是一个语法糖,用于各个对象的方法调用:

3.14.+(42)
#⇒ 45.14

以上正是 Ruby 对待 3.14 + 42 简写法的方式。反过来,它可能使用通用 Object#send 编写:

3.14.send :+, 42
#⇒ 45.14

后者应理解为:“将消息 :+ 与参数 [s] (42) 发送到接收方 3.14。 ”

关于ruby - Ruby 的 AST 中的 'send' 关键字是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44299341/

相关文章:

ruby-on-rails - validates_uniqueness_of 范围为多列

ruby - 如何在 ruby​​ 的 Sublime Text 3 中设置 do-end block 的突出显示?

ruby-on-rails - Rails 3、HTTP 扩展(WebDAV)和 Rack App 安装

java - 返回传递的字符串的 double 值

java - 如何在CompilationUnit中获取有关导入的问题

javascript - 使用 Ruby Sinatra erb 模板访问 jQuery Mobile (jqm) 多页 html

javascript - 使用nodejs和cheerio从html解析表

java - Java 中包含命名空间的 xpath 问题(Dom 解析器)

python - 有什么方法可以从树的转储文件中恢复 AST 树吗?

java - 如何在基于抽象语法树的解释器中表示类