__FILE__
并且本身__LINE__
不是宏,它们是关键字(返回值)。String
话虽如此,您可以_
定义以下划线或字符开头的常量和方法。例如:
__MICKEY__ = :mouse
现在,一个常量可以引用任何东西——一个字符串、一个表达式,甚至是一个代码块(a Proc
or lambda
)或一个整体Class
。
这意味着您可以利用(可以说更强大的)运行时代码执行,而不是编译时宏扩展(Ruby,作为一种解释语言,实际上并没有“编译阶段”)。
例如,C++ 宏:
#define SUM(a, b, c) a + b + c
可以在 Ruby 中适当地近似为
def SUM(a, b, c); a + b + c; end
我说“近似”是因为 a) 在这种情况下,我们定义的是方法,而不是常量或宏,并且 b) C++ 宏在使用与预期数量不同的参数进行评估时仍然可以工作(因为 C++ 宏被扩展,意思是,就好像我们确实找到并替换了),而 Ruby 方法调用语义开始发挥作用,例如检查方法和参数的数量。
为了解决这个问题,在我们的特定示例中,我们可以做(可以说是更灵活的事情)
def SUM(*args); args.inject(:+); end
SUM(1, 2) # => 3
SUM(1, 2, 3, 5) # => 11
如您所见,通过利用 Ruby 的动态特性,您可以实现与 C++ 宏提供的类似(甚至可能更高)级别的表现力。