Ruby的AST中'send'关键字的含义是什么?

pra*_*avj 5 ruby parsing abstract-syntax-tree s-expression ruby-ripper

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

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

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

puts add 1, 2
Run Code Online (Sandbox Code Playgroud)

它导致以下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))))
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释一下:在结果S表达式表示法中发送关键字的定义?

Ale*_*kin 5

Ruby建立在"一切都是对象"范式的基础之上.也就是说,包括数字在内的一切都是一个对象.

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

3.14.+(42)
#? 45.14
Run Code Online (Sandbox Code Playgroud)

以上就是Ruby如何处理3.14 + 42短符号.反过来,它可能使用泛型编写Object#send:

3.14.send :+, 42
#? 45.14
Run Code Online (Sandbox Code Playgroud)

后者应理解为:"将:+带有参数[s](42)的消息发送给接收者3.14."