`

ruby 中全局变量,实力变量,类变量的区别

阅读更多

Ruby中全局变量,实例变量,局部变量,类变量,Symbol对比

八 30th, 2011

Ruby中全局变量,实例变量,类变量,Symbol这些东西经常和其它语言如Java有很大不同,很容易搞混,所以做个总结。

首先是不些命名的约定,注意这些约定是强制性的:

格式 名称 是否需初始化 作用范围 举例
$开头 全局变量 不用,初始前为nil 从定义时开始,直到程序结束 $user
@开头 实例变量 不用,初始前为nil self @user
@@开头 类变量 要先定义,直接使用异常 内部直接使用,外部用:: @@user
[a-z] or _开头 局部变量 不会在初始化前赋nil,要先赋值再调用。伪变量:self, nil, __FILE__等 定义的类、模块、方法的内部,但在类、模块、方法间不能共享 user
[A-Z] 常量 只能被赋值一次,多次赋值会警告,但不报错 内部,外部均可。外部访问”类名::常量名” USER
:开头 Symbol 不用 内外 :user

局部变量时注意:

1、可以定义顶层局部变量,但在类、方法、模块定义内仍无法访问该变量;
2、局部变量不可以在内部类、子类中访问;类中的方法不可以访问该类中定义的局部变量(平级);
3、在声明局部变量的类、模块、方法内,局部变量从声明该变量处开始生效,随类、方法、模块的定义结束而结束;

全局变量时注意:

1、尽量少用,因为他会造成模块间的强耦合

实例变量时注意:

1、实例变量通常在方法中定义;
当在方法中声明实例变量时,该实例变量事实上属于该方法所在的类,而不是该方法;
虽然实例变量是属于类的,但大部分时候我们都是在该类的方法里定义实例变量;
2、Java在创建对象时一次为该对象的所有实例变量都分配了相应的内存空间;
  Ruby语言里的对象完全是动态的,创建对象时该对象没有任何实例变量,直到执行到为实例变量定义时,该对象才动态增加该实例变量;
3、实例变量的访问范围总是:private,即在类定义内对实例变量的赋值和读取没有限制;在类外访问实例变量时,则可以通过方法来访问
4、实例变量永远都不能暴露为public,只能通过类方法(类名.方法名)暴露
5、模块中定义实例变量,可以混入该模块中的类中。即模块中的类可以共享模块中定义的实例变量

类变量时注意:

1、一个类、其子类、它们的实例:的同名类变量共享了同一块内存区域(都引用了同一个变量);
2、模块中定义的类变量,可以混入该模块中的类。即模块中的类可以共享模块中定义的类变量

Ruby类中变量都是私有的,方法默认是public的

Symbol时注意:

1、Symbol就是实例变量、方法、类等的名字
2、如果有一个方法叫move_left,则会自动生成一个symbol叫:move_left。
3、Ruby内部维持一个Symbol Table来保存symbol,可以调用Symbol.all_symbols来查看有哪些。
4、每个String对象都是不同的,即便他们包含了相同的字符串内容;而对于 Symbol 对象,一个名字(字符串内容)唯一确定一个 Symbol 对象。
5、Symbol不用声明,系统会自动惟一。它仅仅是一个名字和内部ID。Symbols非常有用因为在Ruby程序中symbol始终指向同一个对象。

类变量与常量区别:

1、类变量可以重复赋值;常量重复赋值时发出警告(不是错误);
2、类变量默认是protected的,不能在类外部直接引用;(可在继承类中以用或赋值);

类变量与实例变量区别:

1、在类范围内定义的类变量,可以在该类的方法中访问;而实例变量则不行;
2、类变量可在子类中引用或赋值,但实例变量可在类范围内直接引用或赋值;

什么时候需要用symbol?

1、如果对象的内容(字符的序列)非常重要,就使用string
2、如果对象的一致性身份很重要,就用symbol
3、被大量重复使用的内容,如hash中的key一般用symbol
symbol内部是一个整数,可以加大hash检索速度

分享到:
评论

相关推荐

    解析 ruby 全局变量

    ruby> $foo nil ruby> $foo = 5 5 ruby> $foo 5 应谨慎使用全局变量.由于在任何地方都可以被写因此他们相当危险.滥用全局变量会导致很难隔离臭虫;同时也视为程序的设计未经严格考虑.当你发现必须要使用全局...

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    Ruby中的变量学习总结

    Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下: ...

    详细解析Ruby中的变量

    Ruby的全局变量: 全局变量以$开头。未初始化的全局变量的值是零,并使用-w选项产生警告。 全局变量的赋值会改变全局状态。这是不推荐使用全局变量。他们使得程序的含义模糊。 下面是一个例子显示使用全局变量。 #!...

    Ruby 中$开头的全局变量、内部变量、隐藏变量介绍

    Ruby 中充满了一系列的隐藏变量,我们可以从这些预定义的全局变量中获取一些有意思的信息。 全局进程变量 $$ 表示当前运行的 ruby 进程。 代码如下:>> $$=> 17170我们可以从当前进程杀死它自己 代码如下:>> `kill -9...

    深入分析Ruby 变量

    Ruby 全局变量 全局变量以 $ 开头。未初始化的全局变量的值为 nil,在使用 -w 选项后,会产生警告。 给全局变量赋值会改变全局状态,所以不建议使用全局变量。 下面的实例显示了全局变量的用法。 #!/us

    实例讲解Ruby中的五种变量

    Ruby 全局变量 全局变量以 $ 开头。未初始化的全局变量的值为 nil,在使用 -w 选项后,会产生警告。 给全局变量赋值会改变全局状态,所以不建议使用全局变量。 下面的实例显示了全局变量的用法。 #!/usr/bin/ruby ...

    i18n-globals:增加了对I18n全局变量的支持,该变量可用于对每个转换进行插值

    用全局变量扩展Ruby I18n gem。 全局变量可用于每个转换中的插值,而无需在对I18n.translate的调用中显式指定它们。 可以通过I18n.config.globals访问变量。 安装 将此行添加到您的应用程序的Gemfile中: gem 'i18...

    vue2中使用sass并配置全局的sass样式变量的方法

     Sass是一种强大的css扩展语言(css本身并不是一门语言),它允许你使用变量、嵌套规则、mixins、导入等css没有但开发语言(如Java、C#、Ruby等)有的一些特性,并且完全兼容CSS语法。Sass有助于保持大型样式表结构...

    ruby 局部变量

    局部变量不像全局和实变量一样在初始化前含nil值. ruby> $foo nil ruby> @foo nil ruby> foo ERR: (eval):1: undefined local variable or method `foo’ for main(Object) 对局部变量的第一次赋值做的...

    ruby 变量

    Ruby有三类变量,一种常量和两种严格意义上的伪变量(pseudo-variables).变量和常量都没有类型.... 由首字母标识符将其分类: $ 全局变量 @ 实变量 [a-z] 局部变量 [A-Z] 常量 唯一的例外是Ruby的伪变量:self

    非常好的Ruby中文版项目资源,分享出来.zip

    这是 Ruby User’s Guide的简体中文版本:Ruby用户指南。 本指南基于Mark Slagell的英文译本翻译而来,指南最初的...全局变量 实例变量 局部变量 类常量 异常处理:rescue 异常处理:ensure 访问器 对象初始化

    ruby 实变量

    像全局变量一样,实变量在初始前的值是nil. Ruby的实变量用不着声明.这暗含着对象的弹性结构.实际上,每个实变量都是在第一次出现时动态加入对象的. ruby> class InstTest | def set_foo(n) | @foo = n | end ...

    pooled_redis:无需全局变量即可访问redis连接的简单方法

    池化Redis 无需全局变量即可访问 redis 连接的简单方法。 通过database.yml提供Rails.redis_pool和Rails.redis方法和配置。 您可以将此方法添加到自定义模块。安装将此行添加到应用程序的 Gemfile 中: gem 'pooled_...

    ruby语法基础教程

    §3.8.4 全局变量 28 §3.8.5 常量 28 §3.8 与定义有关的操作 29 §3.8.1 alias 29 §3.8.2 undef 30 §3.8.3 defined? 31 第四章 基本类型 33 §4.1 Array 33 §4.2 Hash 34 §4.3 Number 34 §4.4 String 35 §...

    关于PHP常见面试题.pdf

    5. 什么是PHP中的超全局变量(Superglobals)?请列举几个常用的PHP超全局变量。 6. PHP中的面向对象编程(Object-Oriented Programming)是怎样实现的?请简要介绍在PHP中的面向对象编程特性。 7. PHP中的会话管理...

    sinatra_session_global_funs:Sinatra,会话和全局变量的“有趣”

    与Sinatra的“乐趣” 使用一些$全局变量并检查session的差异。

    nbio:Ruby 的 Node.js 中的非阻塞 IO 事件循环

    没有伪装成 C 静态变量、Ruby 常量或类变量的全局变量 没有可疑的默认值或常量值 事件循环在当前 Ruby 绿色线程中运行 后台没有隐式单例(如 EventMachine、Node.js、curl 绑定等) 因此,支持多个同时循环,每个...

Global site tag (gtag.js) - Google Analytics