`

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编码规范

    本文将深入探讨Ruby语言中的类变量、全局变量、实例变量,以及多态的概念,并结合Ruby编码规范来阐述如何有效地编写代码。 一、类变量 类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的...

    解析 ruby 全局变量

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

    Ruby语言教程:Ruby 变量示例

    本文将详细介绍 Ruby 中的五种主要变量类型:普通变量、全局变量、实例变量、类变量以及常量,并通过示例代码加深理解。 #### 二、Ruby中的变量类型详解 ##### 1. 普通变量 (Variable) - **定义与使用**: - 普通...

    Ruby中的变量学习总结

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

    详细解析Ruby中的变量

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

    01Ruby 变量.docx

    ### Ruby 变量详解 ...然而,需要注意的是,尽管 Ruby 提供了全局变量这样的特性,但在实际开发中应避免过度使用,以减少潜在的问题。总的来说,掌握这些变量的概念和用法对于编写高质量的 Ruby 代码至关重要。

    Ruby类实例变量、类实例方法和类变量、类方法的区别

    在Ruby语言中,类实例变量、类实例方法与类变量和类方法是构成面向对象编程模型的重要组成部分。它们各自有不同的用途和行为特性,下面详细介绍这些概念的区别以及它们的使用场景。 首先,类实例变量和类实例方法都...

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

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

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

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

    ruby 中文文档 必备资料

    Ruby支持四种基本变量:局部变量、实例变量、类变量和全局变量,它们分别以小写字母、@、@@和$开头。数据类型则包括字符串、数字、布尔值、数组、哈希等。控制结构包括条件语句(如if/else,case)和循环(如while、...

    深入分析Ruby 变量

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

    ruby中文教程,从基础到深入的让你学习ruby

    变量在Ruby中有四种类型:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)和全局变量(以`$`开头)。数据类型包括字符串、数字、布尔值、数组、哈希等。控制结构包括条件语句(如...

    ruby语言帮助文档(简体中文)

    Ruby也支持变量(局部变量、实例变量、类变量和全局变量),以及常量。 2. **面向对象编程**:Ruby是彻头彻尾的面向对象语言,一切皆对象。每个变量都是一个对象,具有属性(或称为实例变量)和行为(方法)。Ruby...

    ruby中文 文档

    1. **基础语法**:Ruby的基础语法包括变量(本地变量、实例变量、类变量和全局变量)、常量、运算符、流程控制(条件语句、循环语句)以及函数定义。 2. **类与对象**:Ruby是面向对象的语言,所有一切都是对象。...

    ruby中文教程(源代码)

    - 变量:Ruby支持五种变量,包括局部变量(`local`)、实例变量(`instance`)、类变量(`class`)、全局变量(`global`)和常量(`constant`)。它们各自有不同的命名规则和作用域。 - 数据类型:Ruby是动态类型...

    Ruby中文教程及相关源代码

    1. **基础语法**:Ruby的基本数据类型,如整型、浮点型、字符串、数组、哈希等,以及变量的使用,如局部变量、实例变量和全局变量。 2. **控制结构**:包括条件语句(如if/else,case)和循环(如for,while,until...

    Ruby中文教程。。。

    1. 变量:Ruby中的变量分为局部变量、实例变量、类变量和全局变量,它们有不同的标识符和作用范围。例如,`$global`代表全局变量,`@instance`是实例变量,`@@class`为类变量,而`local_var`是局部变量。 2. 数据...

    Ruby 基础语法 视频教程1

    - **全局变量**(Global Variables):以`$`开头,其作用域在整个程序中,如`$debug = true`。 - **常量**(Constants):以大写字母开头,表示不变的值,如`PI = 3.14`,但实际并非完全不可变。 2. 变量规则...

    实例讲解Ruby中的五种变量

    在Ruby中,变量按照作用域和使用方式可以分为五种类型:全局变量、实例变量、类变量、局部变量和常量。 全局变量 全局变量是作用域最广的一种变量,在Ruby中,全局变量以美元符号($)开头。全局变量可以被程序中的...

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

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

Global site tag (gtag.js) - Google Analytics