去年五月在波特兰的Railsconf上,我参加了一个演示文稿,其中有人认为,在Rails中,Ruby类成员变量(如@@ foo)是危险的,因为它们本身就是非线性的。
之后我研究了这个问题,但我从来没有找到真正充实问题的链接。我很感激指向一篇关于Rails和线程的好文章的指针,它真正涉及到类成员问题。另外,很高兴知道Rail 2+和Yarv如何改变这方面的事情。
也许我对演示文稿的记忆是模糊的,但我记得的是,@@ foo存在超出常规警告的问题,必须严格控制任何共享变量访问。我知道Ruby代码本身存在内存泄漏,这些内容在很久以前就得到了解决。我正在寻找关于Ruby共享变量和多任务处理的文章链接,越深入越好。 *目前我不会因为这个而使用类变量,但在某些情况下能够使用它们会很好。
答案 0 :(得分:5)
任何共享的可变状态本质上都是线程不安全的。您需要锁定所有访问以确保一切安全,并确保一切都是可重入的。 @@foo
特别糟糕,因为审计代码更难,因为任何子类都可以访问变量。 Rails 2+通过审核所有内容并确保在必要时使用互斥锁和其他同步原语来“解决”问题。
答案 1 :(得分:1)
我认为它们和以前一样好,但是仍然要在Rails环境中谨慎使用,其中类可能被多次加载(例如,如果你使用mongrel,则每个mongrel一次),所以这个类成员变量可以在这些过程中独立变化。
我认为有一个scoping change for @@ variables in Ruby 1.9,应该考虑到这一点 - 我们有一天都会在那里。
你有什么特别的用途吗?我认为我最近需要一个,但事实证明我对这个主题的理解是粗略的 - 我真正需要的是课堂上的一个实例变量。 (我正在构建一个扩展类的模块,以便我可以添加一些AR风格的声明性宏观优势。)