Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么不';是否使用全局(美元符号$)变量?_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 为什么不';是否使用全局(美元符号$)变量?

Ruby on rails 为什么不';是否使用全局(美元符号$)变量?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我已经在Rails上做了一年半的黑客了,我非常喜欢它!) 在rails中,我们大量使用局部变量、实例变量(如@user\u name)和初始化器中定义的常量(如文件上传路径)。但是为什么没有人使用全局“美元化”变量($),比如$dynamic\u cluster\u name 是因为设计缺陷吗?它与性能相关吗?安全弱点?全局变量通常是设计不好的标志,并且可能是并发问题导致的错误源。全局常量实际上没有这些问题 而不是使用全局变量,考虑使用单变量或类变量。这样,您可以将对共享状态的访问限制在代码的一

我已经在Rails上做了一年半的黑客了,我非常喜欢它!)

在rails中,我们大量使用局部变量、实例变量(如
@user\u name
)和初始化器中定义的常量(如
文件上传路径
)。但是为什么没有人使用全局“美元化”变量($),比如
$dynamic\u cluster\u name


是因为设计缺陷吗?它与性能相关吗?安全弱点?

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

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

是因为设计缺陷问题吗

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

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

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


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

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

我曾经使用它们在基于web的FTP客户端的AJAX调用中保持FTP连接的活动性。这允许用户重复与他们的FTP站点交互,而无需每次执行的每个操作都重新连接


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

是的,我知道global var不能跨线程共享,它们的使用意味着一个糟糕的软件设计,但它们在少数情况下不是有用的吗?例如,我们在路由上有一个限制,主要是签入数据库自定义域名。为了避免数据库中出现两个请求(路由和控制器),我考虑使用全局变量。这就是为什么我想知道。@Hartator,在这种情况下,您要存储的数据不是“全局的”,而是“特定于请求的”(暂且不提,请求是通过使用“全局的”来实现的)。我会尝试以某种方式将它们附加到
请求
,然后从那里取回,尽量避免使用美元符号。当然,我还确定了这些请求中的第二个是否没有真正解析到Rails的数据库缓存?我以为它是只读的。