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 设置所有用户的环境,当用 ...
随机推荐
- [转载]initwithcoder和 initwithframe
大前提是UIViewController有一个UIView.同时,需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Buil ...
- MySQL集群的可行方案
如果单MySQL的优化始终还是顶不住压力时,这个时候我们就必须考虑MySQL的高可用架构(很多同学也爱说成是MySQL集群)了,目前可行的方案有: 一.MySQL Cluster优势:可用性非常高,性 ...
- 锋利的jQuery读书笔记---jQuery中Ajax--get、post等方法
load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现ajax的全部价值. 在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或 ...
- Symfony2学习笔记之表单
对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将从基础开始创建一个复杂的表单,学习表单类库中最 ...
- shell下,进程的前台与后台运行
跟系统任务相关的几个命令:fg.bg.jobs.&.ctrl+z1. & 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行2. ctrl + z 可以将一个 ...
- C#对Excel打印时,PageSetup 对象详解
PageSetup 对象包含所有页面设置的属性(左边距.底部边距.纸张大小等).下面按“页面”.“页边距”.“页眉/页脚”.“工作表”和“无对应选项卡”五个类别,逐一介绍. 一.页面 与“页面”选项卡 ...
- [转] 从 dll 程序集中动态加载窗体
无涯 原文 从 dll 程序集中动态加载窗体 [原创] 昨天晚上花了一晚上时间写了一个从程序集中动态加载窗体的程序.将任何包含窗体的代码编译成 dll 文件,再把 dll 文件拷贝到本程序的目录下,本 ...
- 《Python 学习手册4th》 第十九章 函数的高级话题
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- Raspberry Pi3 ~ 搭建开发环境
关于树莓派的开发环境 纠结了一些时间 ,我的是raspberry Pi 3 mode b 在官网下载 noobs (raspbain 版本)的. 安装完成之后接上显示器 启动系统 然后最初我是想在这个 ...
- div错位解决IE6、IE7、IE8样式不兼容问题
IE6里DIV错位的问题 采用”FLOAT:LEFT“的DIV在IE8.IE7.都没问题,IE6下却向下移动,出现空白.这是因为,IE6采用的内核默认把DIV之间的距离增加了3~5个PX, ...