为什么 Ruby 有像 $$
这样的全局变量?
难道不能通过在 Kernel
中定义访问器和属性来获得类似的行为吗?
这是为了防止在子类中覆盖吗?
最佳答案
这个问题有多个部分,因此有答案。
Q1。
Why does Ruby have global variables like $$ at all?
Ruby 借鉴了 Perl 和 LISP。两者都有全局变量。
Ruby inherited the Perl philosophy of having more than one way to do the same thing. Yukihiro Matsumoto - September 29, 2003
Q2.
Couldn't similar behavior be obtained by defining accessors and attributes in Kernel ?
是的,他们曾经是。然而,可以认为存在具有全局适用性的编程值,因此应该具有全局范围而无需引入任何中间代码。
虽然将这些封装在一个类方法中可能更面向对象,但问题就变成了对用户来说哪个更重要,简单性还是风格。传递给虚拟机的脚本文件的名称是不变的。与命令行参数一样。通过方法抽象化对这些值的访问几乎没有什么好处。全局变量足以满足此目的,并且尽可能轻量级。
Q3.
Is this to prevent overriding in subclasses ?
我不知道这个问题的答案。
最后,我们来看看标题中提出的问题是什么:
What are Ruby globals useful for?
可以通过 trace_var
内核方法在 Ruby 中跟踪变量赋值:
trace_var :$_, proc {|v| puts "$_ is now '#{v}'" }
$_ = "hello"
$_ = ' there'
输出到标准输出:
$_ is now 'hello'
$_ is now ' there'
可以设想一个应用程序,它对一个名为 $state 的变量进行一些事件驱动的更改,比如 GUI 或传感器馈送,其中只需跟踪对全局变量的更改,就不需要程序代码实现基本相同的功能。
关于ruby - Ruby 全局变量有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571332/