为什么不使用全局(美元符号$)变量?

我现在正在攻击Rails一年半,我非常喜欢它! 🙂

在rails中,我们大量使用局部变量,实例变量(如@user_name )和初始化器中定义的常量(如FILES_UPLOAD_PATH )。 但是为什么没有人像$dynamic_cluster_name那样使用全局“美元化”变量($)?

是因为设计缺陷吗? 它与性能有关吗? 安全漏洞?

是因为设计缺陷问题吗?

设计…… 缺陷 ? 这是一个设计的祝福,设计的恩惠,设计的优点,一切,但缺陷! 全局变量很糟糕 ,它们在Web应用程序中尤其糟糕。

使用全局变量的意义在于保持和改变“ 全球状态 ”。 它在一个简单的单线程脚本中运行良好(不,不好,它工作很糟糕 ,但仍然有效),但在Web应用程序中却没有。 大多数Web应用程序运行并发后端:即通过公共代理和负载均衡器响应请求的多个服务器实例。 如果更改全局变量,则仅在其中一个服务器实例中进行修改。 基本上,当您使用rails编写Web应用程序时, 美元符号变量不再是全局变量

然而,全局常量仍然有效,因为它们是常量,它们不会改变 ,并且在不同的服务器中具有它们的几个实例是可以的,因为它们在那里总是相等的。

要存储可变的全局状态,您必须使用更复杂的工具,例如数据库(SQL和noSQL; ActiveRecord是一种非常好的方式来访问数据库,使用它!),缓存后端(memcached),甚至普通文件(在极少数情况下它们很有用)! 但全局变量根本不起作用。

全局变量通常是设计错误的标志,并且可能是由于并发问题导致的错误源。 全局常量实际上没有这些问题。

不要使用全局变量,而应考虑使用单例或类变量。 这样,您可以将对共享状态的访问限制为代码的一小部分,从而更容易避免这些问题。

我曾经用它们来保持FTP连接在基于Web的FTP客户端的AJAX调用中保持活跃。 这允许用户反复与其FTP站点交互,而不必每次都为每个执行的操作重新连接。

因此Ruby中全局变量的一个很好的好处是可以安全地在其中存储资源类型对象。

明显缺乏全球使用是全球变量概念缺陷的指标,而不是ruby实施它们的缺陷。 事实上,我甚至不知道ruby有一个$ global语法。 他们不需要,所以我从来没有找过他们。 好的ruby代码从不需要它们。