Ruby全局变量对什么有用?

Geo*_*mms 9 ruby global-variables

为什么Ruby有全局变量$$

是否可以通过定义访问器和属性来获得类似的行为Kernel

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

Jam*_*rne 0

这个问题有多个部分,因此有答案。

Q1.

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

Ruby 借鉴了 Perl 和 LISP。两者都有全局变量。

Ruby 继承了 Perl 的哲学,即有多种方法可以完成同一件事。 松本幸弘 - 2003 年 9 月 29 日

Q2。

难道不能通过在 Kernel 中定义访问器和属性来获得类似的行为吗?

是的,他们确实如此。然而,可以认为存在具有全局适用性的编程值,因此应该具有全局范围而不引入任何中间代码。

虽然将它们封装在类方法中可能更面向对象,但问题就变成了简单性和风格对于用户来说哪个更重要。传递给虚拟机的脚本文件的名称是不变的。命令行参数也是如此。通过方法抽象对这些值的访问几乎没有什么好处。全局变量足以达到目的,并且尽可能轻量级。

Q3。

这是为了防止子类中的重写吗?

我不知道这个问题的答案。

最后,我们来看看标题中提出的问题是什么:

Ruby 全局变量有什么用?

我们可以通过trace_varKernel 方法跟踪 Ruby 中的变量分配:

trace_var :$_, proc {|v| puts "$_ is now '#{v}'" }
$_ = "hello"
$_ = ' there'
Run Code Online (Sandbox Code Playgroud)

输出到标准输出:

$_ is now 'hello'
$_ is now ' there'
Run Code Online (Sandbox Code Playgroud)

人们可以设想一个应用程序,它对名为 $state 的变量进行一些事件驱动的更改,例如 GUI 或传感器提要,其中简单地跟踪对全局变量的更改就消除了程序代码实现基本相同功能的需要。