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