Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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
Javascript Ruby全局变量是否等同于类对象上的类变量?_Javascript_Ruby On Rails_Ruby_Oop_Inheritance - Fatal编程技术网

Javascript Ruby全局变量是否等同于类对象上的类变量?

Javascript Ruby全局变量是否等同于类对象上的类变量?,javascript,ruby-on-rails,ruby,oop,inheritance,Javascript,Ruby On Rails,Ruby,Oop,Inheritance,我对web开发(嗯,所有的开发)还是相当陌生的,我用RubyonRails为我的文件夹构建了一个电子商务应用程序。我正在使用Redis进行缓存并构建一个简单的购物车(我自己,而不是使用gem) 除了Rails,我还使用MERN(Node、Express、Mongo、ReactJS)堆栈拼接了一些简单的应用程序,以提高我的JavaScript技能 在为我的Redis初始值设定项(config/initializers/Redis.rb)复制代码的过程中,我观察到了一些全局变量: if Rails.

我对web开发(嗯,所有的开发)还是相当陌生的,我用RubyonRails为我的文件夹构建了一个电子商务应用程序。我正在使用Redis进行缓存并构建一个简单的购物车(我自己,而不是使用gem)

除了Rails,我还使用MERN(Node、Express、Mongo、ReactJS)堆栈拼接了一些简单的应用程序,以提高我的JavaScript技能

在为我的Redis初始值设定项(config/initializers/Redis.rb)复制代码的过程中,我观察到了一些全局变量:

if Rails.env.production?
  $redis = Redis.new(url: ENV["REDIS_URL"])
else
  $redis = Redis.new(:host => 'localhost', :port => 6379)
end
class BasicObject
  @@var
end
# NameError: uninitialized class variable @@var in BasicObject
因为:JavaScript,我知道全局变量会让婴儿耶稣哭泣,或者强大的宙斯变成一个大橡皮,或者什么都没有,不管怎样(宗教自由等等)

我知道JavaScript和Ruby是截然不同的动物:

1) JS:我的理解是,设置在“outer”函数作用域之外的变量在上下文中是全局的,并将一个位置存储到指定的值

2) Ruby:$global\u variable、@@class\u variable、@instance\u variable

3) Ruby中的“一切”都是一个对象(数组中的块和单个索引项除外),包括类、原语等

4) Ruby类如果没有显式地从任何其他类继承,则从对象类继承

5) Rails应用程序的“config/initialize”目录包含Rails应用程序实例应(等待)初始化的文件:

查看我的config/initializers/redis.rb文件(上面包含的代码),上下文并不明确(即没有类/模块/etc)

所以

6) config/environment.rb包含以下代码:

# Load the Rails application.
require_relative 'application'

# Initialize the Rails application.
Rails.application.initialize!
7) config/application.rb包含:

require_relative 'boot'
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Ecom
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those 
specified here.
    # Application configuration should go into files in 
config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.cache_store = :redis_store, 
"redis://localhost:6379/0/cache", { expires_in: 90.minutes }
  end
end
这(等待它)“初始化”Rails应用程序对象的实例

9) application对象是类application(???)的实例

谢谢你的时间;鉴于上述情况,以下是我的问题:

A) Rails.application对象实际上是应用程序类的实例吗

B) 这是我最初的问题,我包括了上述内容,因为我觉得这个简单的问题,没有任何背景,可能看起来模糊或不清楚:

Ruby全局变量之间是否有任何区别:

$var = "A Ruby global variable"
$var = "A Ruby global variable"

Class Object
  @@var = "A class variable set on the Class Object"
end
我在任何地方都找不到这个确切的问题,如果我遗漏了什么,我很抱歉

这些功能等价物是否完全等价

因此,作为所有其他类/对象最终从中继承的类,Class Object是Ruby的“全局”上下文吗(或者不是,我错过了一些重要的东西)

C) (作为编辑添加)因为需要启动全局变量并且全局变量在全局范围内可用,所以它是类变量而不是实例变量。这个理由合理吗

假设我正确地认为全局变量和类变量(至少)在功能上是等价的,全局变量“无处不在”,因为“一切”都继承自类对象

D) 在考虑了第一条评论之后,这一切可能会更好地按照鸡/蛋的范式来表达

如果一个全局变量是一个对象,它必须从类对象继承,对吗?这意味着“全局”上下文仍然包装在类对象中

Ruby全局变量是否等同于类对象上的类变量

否:

这些功能等价物是否完全等价

否:

还有一种被称为类实例变量的东西,rubyists使用它来处理类变量。您可以通过在任何def之外为类实例变量赋值来创建该类实例变量:

class Animal
  class <<self
    attr_accessor :x
  end

  @x =  'animal'   #<******* class instance variable *********
end

class Dog < Animal
  def show
    puts Animal.x
  end
end

d1 = Dog.new
d1.show   #=>animal
d2 = Dog.new
d2.show   #=>animal

Animal.x = 'rock'

d1.show  #=>rock
d2.show  #=>rock
A) Rails.application对象实际上是 应用程序类


但这个全局变量也是一个对象。因此,事实上:$var= “一个全局变量”从类对象中固有。。。对吧?

ruby中没有变量是对象

我对web开发还是相当陌生的(好吧,所有的开发)

Rails使用了大量的黑魔法,“黑魔法”是一个中级到高级ruby主题。你没有说你在ruby学习中的位置,但是如果你想了解ruby可以做的事情,你应该阅读“元编程ruby”

1) JS:我的理解是,设置在“outer”函数范围之外的变量在上下文中是全局的

这取决于“变量”的确切含义。用
const
let
声明的变量在词汇范围内

在顶级上下文中用
var
声明的变量实际上根本不是变量,它们成为顶级对象的属性(例如
窗口
文档
全局
,…取决于您的环境)

并将位置存储到指定的值

Ruby和ECMAScript中的所有变量以及ECMAScript中的属性都是如此

3) Ruby中的“一切”都是一个对象(数组中的块和单个索引项除外),包括类、原语等

这实际上取决于你所说的“一切”的确切含义。Ruby中有很多“对象”(在“我们可以谈论的事情”的意义上)不是“对象”(在“我们可以在Ruby代码中分配给变量、传递、操作的事情”的意义上)。例如,变量在Ruby中不是对象

A) Rails.application对象实际上是应用程序类的实例吗

我不知道这和全局变量有什么关系

Ruby全局变量之间是否有任何区别:

$var = "A Ruby global variable"
$var = "A Ruby global variable"

Class Object
  @@var = "A class variable set on the Class Object"
end
是的,有一个非常明显的区别,即在其祖先链中没有
对象
的对象和类将无法访问
对象
的类变量:

if Rails.env.production?
  $redis = Redis.new(url: ENV["REDIS_URL"])
else
  $redis = Redis.new(:host => 'localhost', :port => 6379)
end
class BasicObject
  @@var
end
# NameError: uninitialized class variable @@var in BasicObject
是类对象,作为所有其他类/对象最终从中继承的类,因此,是Ruby的“全局”上下文(或者不是,我错过了一些东西)
Class Object
  @@var = "A class variable set on the Class Object"
end
class BasicObject
  @@var
end
# NameError: uninitialized class variable @@var in BasicObject