我对web开发还是相当陌生的(嗯,所有的开发),用Rails为我的porfolio构建了一个电子商务应用程序。我正在使用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因为: JavaScript,我知道全局变量会让小耶稣哭泣,或者说宙斯变了一个大橡皮筋,或者什么都没有(宗教自由等等).
我知道JavaScript和Ruby是截然不同的动物:
1) JS:我的理解是,在“外部”函数作用域之外设置的变量在上下文中是全局的,并将位置存储到指定的值。
2)红宝石:$global_variable,@@class_variable,@instance_variable
3) Ruby中的“一切”是一个对象(除了数组中的块和单独的索引项),包括类、原语等。
4) Ruby类,如果它不显式地继承任何其他类,则从对象类继承。
5) Rails应用程序的“config/initialize”目录包含Rails应用程序的实例应该(等待它)初始化的文件:
查看我的config/initializers/redis.rb文件(上面包含的代码),上下文不明确(即没有Class/Module/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
end8)根据适当的“铁路指南”:
http://guides.rubyonrails.org/initialization.html#config-application
Rails.application.initialize!这个(等待)“初始化”了Rails应用程序对象的一个实例。
9) Rails.application对象是类应用程序(?)的实例。
谢谢你抽出时间,鉴于以上所述,以下是我的问题:
Rails.application对象实际上是应用程序类的实例吗?
( B)这是我最初的问题,我包括了上述问题,因为我觉得这个简单的问题,没有任何上下文,可能看上去很模糊或不清楚:
Ruby全局变量之间有什么区别吗:
$var = "A Ruby global variable"和
Class Object
@@var = "A class variable set on the Class Object"
end我在任何地方都找不到这个确切的问题,如果我错过了什么,我很抱歉。
如果不是精确的等价物,这些功能等价吗?
作为所有其他类/对象最终继承的类,Class对象是否是Ruby的“全局”上下文(是否,我遗漏了一些重要的内容)?
(添加为编辑),因为需要启动全局变量并在全局范围内可用,所以它是类变量,而不是实例变量。这是推理的声音吗?
假设我认为全局变量和类变量(至少)在功能上是等价的,那么全局变量“无处不在”是可用的,因为“所有”都是从class对象继承来的。
( D)在考虑了第一种意见之后,这一切可能会更好地按照鸡/蛋模式来表达吗?
如果全局变量是对象,则必须继承Class对象,对吗?这意味着“全局”上下文仍然包装在Class对象中。
发布于 2017-05-26 15:14:52
1) JS:我的理解是,在“外部”函数作用域之外设置的变量在上下文中是全局的
这取决于你所说的“变量”到底是什么意思。用const或let声明的变量在词汇范围内。
在顶层上下文中用var声明的变量实际上根本不是变量,它们成为顶级对象的属性(例如window、document、global、…)。视环境而定)。
并将位置存储到指定的值。
Ruby和ECMAScript中的所有变量以及ECMAScript中的属性都是如此。
3) Ruby中的“一切”是一个对象(除了数组中的块和单独的索引项),包括类、原语等。
这取决于你所说的“一切”到底是什么意思。Ruby中有很多“对象”(在“我们可以谈论的东西”的意义上),而不是“对象”(在Ruby代码中“我们可以分配变量、传递、操作的东西”)。例如,变量不是Ruby中的对象。
Rails.application对象实际上是应用程序类的实例吗?
我不知道这和全局变量有什么关系。
Ruby全局变量之间有什么区别吗: $var =“Ruby全局变量” 和 类对象@@var =“类对象上设置的类变量”结尾
是的,有一个非常明显的区别,即在其祖先链中没有Object的对象和类将无法访问Object的类变量:
class BasicObject
@@var
end
# NameError: uninitialized class variable @@var in BasicObject作为所有其他类/对象最终继承的类,Class对象是否是Ruby的“全局”上下文(是否,我遗漏了一些重要的内容)?
Object类作为某种东西的全局上下文,但这并不是因为它是全局的,而是因为它是大多数类的父类(基本上所有不是直接从BasicObject扩展的东西)。
任何在Object中定义的使用继承(类变量、方法和常量)的东西,在从Object派生的所有东西中都是可用的。但这与“全球”无关。继承就是这样运作的。请注意,Object本身是从Kernel和BasicObject继承的,因此这对于在这两者中定义的任何内容都是正确的。
(添加为编辑),因为需要启动全局变量并在全局范围内可用,所以它是类变量,而不是实例变量。这是推理的声音吗?
不,它不是。全局变量既不是实例变量,也不是类变量。它是一个全局变量。
如果全局变量是对象,则必须继承Class对象,对吗?这意味着“全局”上下文仍然包装在Class对象中。
变量不是Ruby中的对象。
发布于 2017-05-26 05:14:06
Ruby全局变量是否等效于class对象上的类变量?
否:
$x = "hello"
class Object
@@y = "goodbye"
p class_variables
end
--output:--
[:@@y]如果不是精确的等价物,这些功能等价吗?
否:
$x = 'hello'
class Animal
@@y = 'goodbye'
end
class Dog < Animal
def show
puts $x
puts @@y
end
end
Dog.new.show
class BasketBall
def show
puts $x
puts @@y
end
end
BasketBall.new.show
--output:--
hello
goodbye
hello
1.rb:19:in `show': uninitialized class variable @@y in BasketBall (NameError)
from 1.rb:24:in `<main>'@@ variables不用于红宝石--它们被认为是设计缺陷。$ variables很少被使用。关键变量类型是:
x => local variable
@x => instance variable还有一个被称为类实例变量的类,这就是规则者对类变量所使用的。通过在任何defs之外分配给类实例变量,可以创建一个类实例变量:
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 #=>rock1) JS:我的理解是,在“外部”函数作用域之外设置的变量在上下文中是全局的,并将位置存储到指定的值。
它们成为window对象的属性。
Ruby类,如果不显式地继承任何其他类,则从对象类继承。
所有ruby对象都从对象继承--即使它们是从另一个类继承的:
class Object
def greet
puts 'hello'
end
end
class Animal
end
class Dog < Animal
end
Dog.new.greet
--output:--
helloRails.application对象实际上是应用程序类的实例吗?
> $ rails c
Loading development environment (Rails 4.2.7)
2.3.0 :001 > x = Rails.application
...
...
2.3.0 :002 > x.class
=> Test4::Application 但是全局变量也是一个对象。因此,当然:$var =“全局变量”继承了类对象.对吗?
红宝石中没有变量是一个对象。
我对web开发还是很陌生的(嗯,所有的开发)
Rails使用了大量的黑魔法,而“黑魔法”是一个中级到高级的红宝石主题。你没有说你在学习红宝石,但是如果你想了解你可以用红宝石做的事情,你应该读一下“元编程Ruby”。
https://stackoverflow.com/questions/44193137
复制相似问题