为什么Ruby根本就有$$
等全局变量?
通过在Kernel
中定义访问者和属性,无法获得类似的行为吗?
这是为了防止在子类中覆盖吗?
答案 0 :(得分:0)
这个问题有多个部分,因此有答案。
Q1。
为什么Ruby根本就有像$$这样的全局变量?
Ruby从Perl和LISP借用。两者都有全局变量。
Ruby继承了Perl的理念,即拥有多种方法 同一件事情。 Yukihiro Matsumoto - 2003年9月29日
Q2。
通过定义访问器无法获得类似的行为 和内核中的属性?
是的,他们一直都是。然而,可以认为存在具有全局适用性的编程值,因此应该具有全局范围而不引入任何中间代码。
虽然将这些封装在类方法中可能更为OO,但问题变得对用户,简单或风格更重要。传递给虚拟机的脚本文件的名称是不变的。和命令行参数一样。通过方法抽象对这些值的访问获得的好处很少。全局变量就足够了,并且尽可能轻量化。
Q3。
这是为了防止在子类中覆盖吗?
我不知道答案。
最后,我们来看标题中提出的问题:
Ruby globals对于什么有用?
可以通过trace_var
内核方法跟踪Ruby中的变量赋值:
trace_var :$_, proc {|v| puts "$_ is now '#{v}'" }
$_ = "hello"
$_ = ' there'
输出到STDOUT:
$_ is now 'hello'
$_ is now ' there'
可以设想一个应用程序对名为$ state的变量进行一些事件驱动的更改,例如GUI或传感器提要,其中简单地跟踪对全局变量的更改消除了对实现基本相同功能的程序代码的需要。