Ruby学习: 类的定义和实例变量
ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的。
一、类的定义语法
类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾。
类中的方法以 def关键字开头,后面跟方法名及参数列表(如果有的话),以 end标识符结尾。
类也有构造函数,名字必须为initialize。
对象通过new来创建,new是类的方法。
举例如下:
class Demo
def initialize
puts "begin create object"
end def test
puts "test"
end
end #创建对象,调用对象的方法
demo1= Demo.new
demo1.test
上面的代码先定义了一个类Demo ,类中定义了两个分方法,这两个方法均没参数。
接着通过new来创建了一个对象,赋值给变量 demo1,最后调用 类的 test方法。
上面代码运行的输出信息是:
begin create object
test
二、类中的成员变量
类中有三种变量
1、一个是局部变量,在方法内 和方法的参数。这个就是普通的标识符定义即可。
2、类的实例变量。这个定义与其它语言有差别,需要以 @符号来标识。不能直接通过对象访问,需要通过方法来访问,相当于java中的private成员。
3、类变量,属于类级别的,为类的所有对象所共享,需要以 @@符号来标识
三、类的实例变量
下面我们来看一个类的实例变量的例子:
class Demo
def initialize(value)
@a = value
end def getA
return @a
end def setA(value)
@a=value
end
end #创建对象,调用对象的方法
demo1= Demo.new(2)
puts demo1.getA
demo1.setA(10)
puts demo1.getA
上面代码创建的Demo类在构造函数中定义和初始化了一个实例变量 @a,并且定义了get和set方法来访问实例变量。
在ruby中,无法直接在类的外部访问实例变量,如 puts demo1.@a 这样会报语法错误的。
对于实例变量,如果每次需要定义相应的 get 和 set方法,并且给通过get和set方法才能在外部访问,这显得比较啰嗦和麻烦。
ruby通过其元编程的特性可以简化这些操作。具体我们来看下示例代码:
class Demo
attr_accessor:a def initialize(value)
@a=value
end
end #创建对象,调用对象的方法
demo1= Demo.new(2)
puts demo1.a
demo1.a = 10
puts demo1.a
上面代码通过 attr_accessor :a 就定义了一个实例变量 @a ,并在构造函数中对它初始化。
与上面 的区别是,外部可以直接通过对象变量访问,但不能加 @符号,不过在类的方法内访问需要加@符号。
可以看出,采用这种方式,省去了定义get和set方法,访问起来更加简洁。
设置attr_accessor,会自动对实例变量(如上面例子中的 @a),创建set和get方法。
对应的还有attr_reader只设置get方法,attr_writer只设置set方法。
class Demo
attr_reader:a def initialize(value)
@a=value
end def set(value)
@a = value
puts @a
end
end #创建对象,调用对象的方法
demo1= Demo.new(2)
demo1.set(10)
puts demo1.a
如果定义成attr_reader,则在类的外部只能demo1.a来读取变量信息,但不能 demo1.a = 2 这种方式来赋值(因为这实际调用的是set方法,而attr_reader不会产生set方法)。注意,这只影响外部访问,类的内部方法使用没有关系。
class Demo
attr_writer:a def initialize(value)
@a=value
end def set(value)
@a = value
puts @a
end def print
puts @a
end
end #创建对象,调用对象的方法
demo1= Demo.new(2)
demo1.a =20
demo1.print
从上面例子可以看出,定义成 attr_writer方式,在类的外部只能赋值,不能读取(如这里的 puts demo1.a会报语法错误。).
同样类的内部访问不受影响。
需要说明的是,类的实例变量不一定先要在构造函数中定义和初始化。 可以在类的任意方法中定义和使用,使用前也不需要初始化。
如下面代码:
class Demo
def set(value)
@a = value
end def print
puts @a
end
end #创建对象,调用对象的方法
demo1= Demo.new
demo1.print
demo1.set(10)
demo1.print
如果在初始化之前就引用实例变量,则值为 nil (类似java中的null)。如上面代码,创建对象后直接调用 print方法,在print方法中就引用了@a,而在这之前@a并未被定义和初始化,这不会报错,只是这时@a的值为 nil.
可以看出,相对java, c++等传统语言来说,ruby中类的实例变量的操作更加灵活和清晰。
Ruby学习: 类的定义和实例变量的更多相关文章
- 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?
第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一. 案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...
- Swift学习——类的定义,使用,继承,构造等(五)
Swift学习--类的定义,使用.继承,构造等(五) 类的使用说明 1 使用class和类名来创建一个类名,比如: class student 2 类中属性的声明和常量和变量一样,唯一的差别就是他们的 ...
- 【JAVA】笔记(2)---面向过程与面向对象;类,对象;实例变量,引用;构造方法;
面向过程与面向对象: 1.面向过程思想的典型栗子是C语言,C语言实现一个程序的流程是:在主函数中一步一步地罗列代码(定义子函数来罗列也是一样的道理),以此来实现我们想要的效果: 2.面向对象思想的典型 ...
- python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件
面向对象编程(OOP)术语: class TestClass(object): val1 = 100 def __init__(self): self.val2 = 200 ...
- Java:【面向对象:类的定义,静态变量,成员变量,构造函数,封装与私有,this】
本文内容: 什么是面对对象 类的定义与对象实例化 成员变量 成员变量的有效范围 成员变量的赋值 静态变量.方法与实例变量.方法 构造函数 封装与私有 this关键字 注:函数和方法是一样东西.[由于我 ...
- iOS在类内部怎么访问实例变量比较好?
OC在类文件的内部访问实例变量,有直接访问和使用getter/setter方法访问两种方式,它们的区别有: 1.直接访问不经过OC的方法分发(method dispatch),所以访问速度比较快,在这 ...
- python 类的定义 实例化 实例完后初始化
先来看看 类的__init__, 类的__new__ , 元类的__new__的执行顺序 class TMetaclass(type): def __new__(cls,name,bases,attr ...
- Java类的定义与类的实例化
目录 Java类的定义与类的实例化 类的定义 定义一个简单的类 定义一个成员变量 定义一个方法 定义一个构造器 类的实例化 创建对象及使用对象: 创建对象的过程在内存中的表现 Java类的定义与类的实 ...
- IOS总结 静变量static、全局变量extern、局部变量、实例变量
1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用s ...
随机推荐
- [每日一题] OCP1z0-047 :2013-08-22 正则表达式---[^Ale|ax.r$]'
正确答案:DE 一.Oracle正则表达式的相关知识点 '[^Ale|ax.r$]': ^:匹配行的开始字符 $:匹配行的结束字符 []:方括号表示指定一个匹配列表,该列表匹配列表中显示的任何表达式. ...
- linux 知识整理1linux 常见的目录
linux 系统现在也是搭配啦图形操作界面. 本人初次学习linux,不是为工作,我的工作是玩Asp.net 的.学习linux 也算是知识的储备吧. 学习linux必须知道一些基本的知识. 目录 用 ...
- 笔记-Nodejs中的核心API之Events
最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的 ...
- JavaScript之字符串引号的使用技巧
在JavaScript中可以随意使用引号,但是最好根据字符串包含的字符来选择. 1.如果字符串里面包含了单引号,那就把字符串放在双引号里面 var age = "this is 'pig'? ...
- OpenCV 开发环境环境搭建(win10+vs2015+opencv 3.0)
OpenCV 3.0 for windows(下载地址:http://opencv.org/): 本测试中,OpenCV安装目录:D:\Program Files\opencv,笔者操作系统为64位. ...
- iOS 10 因苹果健康导致闪退 crash
如果在app中调用了苹果健康,iOS10中会出现闪退.控制台报出的原因是: Terminating app due to uncaught exception 'NSInvalidArgumentEx ...
- Android应用开发基础篇(15)-----URL(获取指定网址里的图片)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2389190.html 一.概述 URL,说白了就是一个网络地址(网址),通常一个网址里包 ...
- mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库
简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.特点: (1)备份过程快速.可靠 ...
- app自动化的webView页面测试思路(appium工具)。
1.获取当前activity多有的handles,然后去遍历它,发现webView后切换到webView对应模式,就可以了.进一步操作webView的话用下面的方法(driver.getPageSou ...
- 【转】关于UItableViewCell的accessoryType属性
转载自:http://blog.csdn.net/kmyhy/article/details/6442351 使用的话,例如: cell.accessoryType = UITableViewCell ...