ruby - Ruby 全局变量有什么用?

标签 ruby global-variables

为什么 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/

相关文章:

ruby - 什么版本的 Ruby 2.0.0 是稳定版?

Ruby,捕获字符串的结尾部分

javascript - 确保一次只有一个 setTimeout 运行(处于事件状态)?

C:为什么我的库中的全局变量不会更新? (使用 ALSA 库)

ruby-on-rails - Friendly_id 名称未显示在 url 中

ruby - 续集在添加关联时访问many_to_many连接表

java - 如何在 Ruby 程序中捕获 java.sql.sqlException?

c++ - C++ 中的全局变量

Javascript 局部变量覆盖全局变量?

javascript - 为什么JavaScript声明的变量在初始化之前在全局对象中?