Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 在Rails中,每个新请求都会重置任意类的类属性吗?_Ruby On Rails_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 在Rails中,每个新请求都会重置任意类的类属性吗?

Ruby on rails 在Rails中,每个新请求都会重置任意类的类属性吗?,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,假设我在Rails应用程序中有一个类Foo class Foo @@bar = "hello" def self.change @@bar = "goodbye" end def self.get_bar @@bar end end 如果在某个时刻,某个用户执行一个控制器操作,该操作包括 Foo.change 在服务器重新启动之前,Foo.get\u bar会在每个用户会话中返回“再见”吗?yes,@@s是类变量,但类变量不是线程安全的,因此多

假设我在Rails应用程序中有一个类Foo

class Foo   
  @@bar = "hello"
  def self.change
    @@bar = "goodbye" 
  end

  def self.get_bar
    @@bar
  end 
end
如果在某个时刻,某个用户执行一个控制器操作,该操作包括

Foo.change

在服务器重新启动之前,Foo.get\u bar会在每个用户会话中返回“再见”吗?

yes,@@s是类变量,但类变量不是线程安全的,因此多线程系统将对此做出不一致的响应。一般经验法则:不要使用类变量

在开发环境中,每个请求都会重新加载类,因此您将看到每个请求都会重置类变量

在生产环境中,类不会在每个请求上重新加载,因此一般来说,类变量应该在给定的Ruby进程中跨请求保留

请记住,某些Rails服务器实际上可能有多个进程,因此不能保证所有用户和所有请求都共享类变量

其他Rails服务器可能是多线程的,因此您必须特别小心如何改变共享状态(例如类变量)

出于这些原因,最好避免像@andrew21所提到的那样以这种方式使用类变量