为什么Ruby需要像$$
这样的全局变量?
是否可以通过在Kernel
中定义访问器和属性来实现类似的行为?
这是为了防止在子类中覆盖吗?
为什么Ruby需要像$$
这样的全局变量?
是否可以通过在Kernel
中定义访问器和属性来实现类似的行为?
这是为了防止在子类中覆盖吗?
这个问题包含多方面,因此也有多个答案。
Q1.
Ruby 为什么会有像 $$ 这样的全局变量?
Ruby 借鉴了 Perl 和 LISP 的一些特性,二者均有全局变量。
Ruby 继承了 Perl 的哲学,即同一件事情可以有多种不同的实现方式。松本行弘 - 2003年9月29日
Q2.
通过在 Kernel 中定义访问器和属性不也能实现类似的功能吗?
是的,事实上已经有这样的实现方式了。然而,可以认为存在一些具有全局适用性的编程值,因此应该在不引入任何中介代码的情况下具有全局范围。
虽然将这些值封装在类方法中可能更加面向对象,但问题在于对用户来说哪个更重要,简单还是风格。传递给虚拟机的脚本文件名是一个不变量。命令行参数也是如此。通过方法抽象访问这些值所获得的收益很小。全局变量足以满足需求,并且是实现最轻量级的方式。
Q3.
这是为了防止子类中的覆盖吗?trace_var
,可以跟踪Ruby中的变量赋值。trace_var :$_, proc {|v| puts "$_ is now '#{v}'" }
$_ = "hello"
$_ = ' there'
输出到标准输出:
$_ is now 'hello'
$_ is now ' there'
$$
等特殊全局变量,还是一般的全局变量?特殊全局变量是Ruby中来自Perl的影响之一,事实上有替代方法可以获取相同的信息(例如,在$$
的情况下使用Process.id
),这些方法现在更受欢迎。 - mikej