首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby全局变量是否等效于class对象上的类变量?

Ruby全局变量是否等效于class对象上的类变量?
EN

Stack Overflow用户
提问于 2017-05-26 03:27:39
回答 2查看 1.1K关注 0票数 4

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

除了Rails之外,我还使用MERN (Node、Express、Mongo、ReactJS)栈将几个简单的应用程序拼接在一起,以提高我的JavaScript技能。

在我的Redis初始化程序(config/initializers/redis.rb)的复制-面食代码过程中,我观察到了一些全局变量:

代码语言:javascript
运行
复制
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 .包含以下代码:

代码语言:javascript
运行
复制
# Load the Rails application.
require_relative 'application'

# Initialize the Rails application.
Rails.application.initialize!

7) config/application.rb包含:

代码语言:javascript
运行
复制
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

8)根据适当的“铁路指南”:

http://guides.rubyonrails.org/initialization.html#config-application

代码语言:javascript
运行
复制
Rails.application.initialize!

这个(等待)“初始化”了Rails应用程序对象的一个实例。

9) Rails.application对象是类应用程序(?)的实例。

谢谢你抽出时间,鉴于以上所述,以下是我的问题:

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

( B)这是我最初的问题,我包括了上述问题,因为我觉得这个简单的问题,没有任何上下文,可能看上去很模糊或不清楚:

Ruby全局变量之间有什么区别吗:

代码语言:javascript
运行
复制
$var = "A Ruby global variable"

代码语言:javascript
运行
复制
Class Object
  @@var = "A class variable set on the Class Object"
end

我在任何地方都找不到这个确切的问题,如果我错过了什么,我很抱歉。

如果不是精确的等价物,这些功能等价吗?

作为所有其他类/对象最终继承的类,Class对象是否是Ruby的“全局”上下文(是否,我遗漏了一些重要的内容)?

(添加为编辑),因为需要启动全局变量并在全局范围内可用,所以它是类变量,而不是实例变量。这是推理的声音吗?

假设我认为全局变量和类变量(至少)在功能上是等价的,那么全局变量“无处不在”是可用的,因为“所有”都是从class对象继承来的。

( D)在考虑了第一种意见之后,这一切可能会更好地按照鸡/蛋模式来表达吗?

如果全局变量是对象,则必须继承Class对象,对吗?这意味着“全局”上下文仍然包装在Class对象中。

EN

Stack Overflow用户

发布于 2017-05-26 05:14:06

Ruby全局变量是否等效于class对象上的类变量?

否:

代码语言:javascript
运行
复制
$x = "hello"

class Object 
  @@y = "goodbye"
  p class_variables
end

--output:--
[:@@y]

如果不是精确的等价物,这些功能等价吗?

否:

代码语言:javascript
运行
复制
$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很少被使用。关键变量类型是:

代码语言:javascript
运行
复制
x       => local variable
@x      => instance variable

还有一个被称为类实例变量的类,这就是规则者对类变量所使用的。通过在任何defs之外分配给类实例变量,可以创建一个类实例变量:

代码语言:javascript
运行
复制
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

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

它们成为window对象的属性。

Ruby类,如果不显式地继承任何其他类,则从对象类继承。

所有ruby对象都从对象继承--即使它们是从另一个类继承的:

代码语言:javascript
运行
复制
class Object
  def greet
    puts 'hello'
  end
end


class Animal
end

class Dog < Animal
end

Dog.new.greet

--output:--
hello

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

代码语言:javascript
运行
复制
> $ 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”。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44193137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档