Ruby全局变量有什么用处?

9

为什么Ruby需要像$$这样的全局变量?

是否可以通过在Kernel中定义访问器和属性来实现类似的行为?

这是为了防止在子类中覆盖吗?


2
你是在特别询问像$$特殊全局变量,还是一般的全局变量?特殊全局变量是Ruby中来自Perl的影响之一,事实上有替代方法可以获取相同的信息(例如,在$$的情况下使用Process.id),这些方法现在更受欢迎。 - mikej
全局变量通常被使用,尽管存在 $$、$0 等可能会使它们合法化的情况。 - George Simms
2
是的,通过在Kernel上定义方法(访问器)可以获得类似的行为,但是显而易见的是,“类似”并不等同于“相同”。首先,在Ruby中,与访问全局变量相比,方法调用是昂贵的。 - Jordan Running
1个回答

0

这个问题包含多方面,因此也有多个答案。

Q1.

Ruby 为什么会有像 $$ 这样的全局变量?

Ruby 借鉴了 Perl 和 LISP 的一些特性,二者均有全局变量。

Ruby 继承了 Perl 的哲学,即同一件事情可以有多种不同的实现方式。松本行弘 - 2003年9月29日

Q2.

通过在 Kernel 中定义访问器和属性不也能实现类似的功能吗?

是的,事实上已经有这样的实现方式了。然而,可以认为存在一些具有全局适用性的编程值,因此应该在不引入任何中介代码的情况下具有全局范围。

虽然将这些值封装在类方法中可能更加面向对象,但问题在于对用户来说哪个更重要,简单还是风格。传递给虚拟机的脚本文件名是一个不变量。命令行参数也是如此。通过方法抽象访问这些值所获得的收益很小。全局变量足以满足需求,并且是实现最轻量级的方式。

Q3.

这是为了防止子类中的覆盖吗?
对此我不知道答案。
最后,我们来到标题中所问的问题:
Ruby全局变量有什么用处?
通过Kernel方法trace_var,可以跟踪Ruby中的变量赋值。
trace_var :$_, proc {|v| puts "$_ is now '#{v}'" }
$_ = "hello"
$_ = ' there'

输出到标准输出:

$_ is now 'hello'
$_ is now ' there'

可以想象一个应用程序,它对名为 $state 的变量进行了一些事件驱动的更改,比如 GUI 或传感器反馈,在这种情况下,仅跟踪全局变量的变化就可以消除实现基本相同功能的程序代码的需要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接