我正在尝试学习 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/