ruby中实例变量、类变量等等的区别和联系
ruby的变量有局部变量,全局变量,实例变量,类变量,常量。
1、局部变量
局部变量以一个小写字母开头或下划线开头
局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声明所在的块、方法定义、类/模块定义的结尾。大家在写代码时经常这样写:
irb(main):001:0> i=123 ---------- 这里的i就是局部变量
=>123
irb(main):002:0> s="hi" ---------- 这里的s就是局部变量
=>"hi"
ruby的变量是动态变量,某个变量在前一刻是数字型,在后一刻可以是字符型:
irb(main):003:0> x=321
=>321
irb(main):004:0> x="hello"
=>"hello"
ruby是动态变量,但却是强类型,例如字符和数字不能直接相加:
irb(main):005:0> x=10
=>10
irb(main):006:0> y="hi"
=>"hi"
irb(main):007:0> x+y
TypeError: String can't be coerced into Fixnum
from(irb):7:in '+'
from(irb):7
from : 0
必须手工进行转换: irb(main):008:0> x.to_s + y
=> "10hi"
2、全局变量
ruby的全局变量以$开头,例如: $x $y。全局变量可以在程序的任何地方加以引用。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为nil
ruby有内置的全局变量,应该是从perl哪里抄来的,例如 $!记录最近一次产生的错误,$. 表示行号等。良好的编程实际,是不使用全局变量,他们危险而难以跟踪。
3、实例变量
ruby的实例变量以@开头,是指实例化后的对象,才绑定的变量。实例变量属于特定的对象。例如:
irb(main):016:0> class Myclass
irb(main):017:0> def initialize(name,gender,age)
irb(main):018:0> @name=nameirb(main):019:0> @gender=gender
irb(main):020:2> @age=age
irb(main):021:0> end
irb(main):022:0> end
=> nil ---------------@name, @gender,@age都是实例变量。可以在类或子类的方法中引用实例变量。若引用尚未被初始化的实例变量的话,其值为nil。irb(main):023:0> x=Myclass.new("john")
=> #<Myclass:0x7f2e15a7dad8 @name="john">Myclass类,他的构造器接收一个name参数,然后把该参数赋值给实例变量@name。
x是Myclass的实例,她拥有实例变量@name。
只有在类被实例化时,实例变量才产生和存在。但是,实例对象并不能直接访问实例变量:
irb(main):022:0> x.@name
SyntaxError: compile error
(irb):22: syntax error, unexpected tIVAR
from (irb):22
from :0
这样是错误的。必须在;类里面,定义get方法,来访问实例变量:
irb(main):023:0> class Myclass
irb(main):024:1> def name
irb(main):025:2> @name
irb(main):026:2> end
irb(main):027:1> end
=> nilirb(main):028:0> x.name
=> "john"
当然,也可以定义set方法,来设置实例变量:
irb(main):029:0> class Myclass
irb(main):030:1> def name=(value)
irb(main):031:2> @name=value
irb(main):032:2> end
irb(main):033:1> end
=> nilirb(main):034:0> x.name="jean"
=> "jean"irb(main):035:0> x.name
=> "jean"
这个set和get,可以通过ruby的元编程来实现,例如:
irb(main):036:0> class Myclass
irb(main):037:1> attr_accessor :age
irb(main):038:1> end
=> nilirb(main):039:0> x.age=20
=> 20irb(main):040:0> x.age
=> 20
只要设置attr_accessor就够了,他会对@age这个实例变量,创建set和get方法。
irb(main):041:0> x
=> #<Myclass:0x7f2e15a7dad8 @name="jean", @age=20>对应的还有attr_reader只设置get方法,attr_writer只设置set方法。
4、类变量
ruby的类变量以@@开头,例如在类里申明的@@x @@y 等,一般很少使用。
类变量在类的定义中定义,可以在类的特殊方法、实例方法等处对类变量进行赋值和引用。类变量被类,类的子类和他们的实例对象共享。
class Person
@@number = 0 #使用前必须有初值
def initialize(name, gender, age)
@age = age
@@number += 1
end
end
类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。可以把类变量看作一种被类、子类以及它们的实例所共享的全局变量。
模块中定义的类变量(模块变量)被所有包含该模块的类所共享。
module TestModule
@@foo = 10
end
class Klass
include Foo
p @@foo += 1 # => 11
end
class Base
include Foo
p @@foo += 2 # => 12
end
5、常量
ruby的常量以大写字母开头,常数的定义和初始化由赋值过程完成。
irb(main):048:0>Pi=3.14 ----------Pi就是一个常量
=>3.14
然而,ruby的常量是可以改变的。若对已定义的常数进行赋值的话,会出现警告信息:
irb(main):049:0> Pi=3.15
(irb):49: warning: already initialized constant Pi
=> 3.15irb(main):050:0> Pi
=> 3.15
尽管触发警告,但常量的确被改变了。
注意:1)若引用未定义的常数会引发NameError异常。
2)常量可以定义在类和模块中,不能定义在方法中
通常在类里设置常量:
irb(main):051:0> class Myclass
irb(main):052:1> Pi=3.1415
irb(main):053:1> end
=> 3.1415
3)若想在外部访问类或模块中的常数时,要使用“::”操作符.
从类的外部访问这个常量:irb(main):055:0>Myclass::Pi
=>3.1415
模块也一样,例如访问ruby内置的Math模块的PI常量: irb(main):056:0>Math::PI
=>3.14159265358979
4)在类定义表达式生成类对象的同时,还会将类对象赋值给一个与该类同名的常数,引用类名也就是引用该常数。
class Test
end
p Test.class #Class
p Test #test
若想访问Object类中的常数(顶层的常数)时,也需要也使用"::"操作符,但操作符左边为空。
ruby中实例变量、类变量等等的区别和联系的更多相关文章
- 3.ruby语法基础,全部变量,实例变量,类变量,局部变量的使用和注意的要点
1.ruby的全局变量的概念和Java的全局变量的概念不同, ruby的全局变量是以$符号开头的,如果给全局变量的初始化值为nil会出现警告. 赋值给全局变量,这是ruby不推荐的,这样会使程序变得很 ...
- java 中静态变量(类变量)与实例变量 静态方法与实例方法
静态变量: 在类内部中,方法的外部声明的对象而且加上static; 实例变量: 在类内部中,声明不需要加static; 比如: public class Demo{ int i1=0; static ...
- ios -- 成员变量、实例变量与属性的区别
最近打开手机就会被胡歌主演的<猎场>刷屏,这剧我也一直在追,剧中的郑秋冬,因为传销入狱五年,却在狱中拜得名师孙漂亮(孙红雷),苦学HR,并学习了心理学,成功收获两样法宝.出狱后因为怕受 ...
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...
- .NET中公共变量与属性的区别
在我们的程序中经常会出现以下的代码: 如: 成员变量 public string Name; 或者用属性 private string name ...
- ruby中proc和lambda的return区别
学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了 一下内容部分来自<<rub ...
- Java中成员变量和局部变量的区别
java面向对象过程中,最基本的两类变量就是成员变量和局部变量 成员变量是写在类中并且写在方法外部,一般写在每个类的头部,用于初始化或者方法操作,作用域是整个类被实例化到被销毁,中间变量都可以被外部方 ...
- PHP接口中的静态变量、常量与类中静态变量、常量的区别
接口: 1 不能够定义静态变量(常量除外) 2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用 3 不 ...
- Linux中环境变量相关文件的区别
Linux下各种不同环境变量相关文件的作用: 1. /etc/environment 设置整个系统的环境,系统启动时,该文件被执行. 2. /etc/profile 设置所有用户的环境,当用 ...
随机推荐
- Trianglify – 五彩缤纷的 SVG 背景图案
Trianglify 是一个能够生成五颜六色的三角形图案的 JavaScript 库,可以用来作为 SVG 图像和 CSS 背景.它的灵感来自于 Btmills 的 Geopattern,并使用 d3 ...
- Activiti 多个并发子流程的应用
多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批. 流程如下: 要解决以上问题,需要实现多个子流程并行处 ...
- 【Java】MD5加密
package sdfg; import java.math.BigInteger; import java.security.MessageDigest; import java.security. ...
- wxWidgets进度条
#include <wx/wx.h> #include <wx/progdlg.h> class myApp : public wxApp { public: bool OnI ...
- 决策树之 CART
继上篇文章决策树之 ID3 与 C4.5,本文继续讨论另一种二分决策树 Classification And Regression Tree,CART 是 Breiman 等人在 1984 年提出的, ...
- 学习macos常用的一些快捷键笔记
学习mac 操作系统使用笔记 Dock功能学习 类似快捷图标一样 Command+q quit a program Dock上添加与删除都用拖动 command+delete 删除文件 shift+c ...
- 给新centos系统虚拟机配置网络服务
记录下今天新建虚拟机的过程吧. 镜像:CentOS-6.3-x86_64-minimal; 虚拟机版本: vm 8.0 LET'S----------------------->GO 手动新建一 ...
- 数据结构——Java实现二叉树
相关概念 存储结构: 顺序存储结构:二叉树的顺序存储结构适用于完全二叉树,对完全二叉树进行顺序编号,通过二叉树的性质五(第1个结点为根结点,第i个结点的左孩子为第2i个结点,右孩子为第2i+1个结点) ...
- JS面向对象组件(三)--面向对象中的常用属性和方法
图片的由来看下面: 1.hasOwnProperty:看是不是对象自身下面的属性 var arr = []; arr.num = ; Array.prototype.num2 = ; //所有的数组对 ...
- Java循环语句之 for
Java 的循环结构中除了 while 和 do...while 外,还有 for 循环,三种循环可以相互替换. 语法: 执行过程: <1>. 执行循环变量初始化部分,设置循环的初始状态, ...