一、类属性声明
一个对象的外部可见部分被称其为属性。ruby通过对象的实例变量来表示对象的内部状态,即,属性。既然是对外部可见的。Ruby中,实例变量无法直接为对象外使用,只能通过对象定义的操作方法访问。同理,实例变量也不能变成public变量,同样是通过方法访问
那就是可以通过某种方式读取和修改的。Ruby中是通过定义方法来访问属性。有两种方法方式:
1、直接定义类属性的方法
ruby 代码
-
-
- class Test
- def initialize(name)
- @name=name
- end
- def name
- @name
- end
- def name=(att)
- @name=att
- end
- end
这里为属性name对外提供了读取和删除的方法
2、通过Module的方法定义
该声明不是Ruby语法的一部分,它不过是定义在类Module的方法,该方法会自动创建访问类属性的方法
ruby 代码
- class name
- attr: attribute[,writable]
-
- attr_reader :attribute[,attribute,......]
-
- attr_wirter :attribute[,attribute,......]
-
- attr_accessor :attribute[,attribute,......]
-
- end
attr :直接定义属性,默认的只读,如果后面跟true,表示属性可写,false为只读
ruby 代码
- class Test
- attr :foo, true
- attr :read
- end
- c = Test.new
- c.foo = 5
- p c.foo
-
- c.read='ok'
-
attr_reader: 表示该方法只读,该方法自动创建如下方法:
ruby 代码
- class name
-
- def attribute
-
- attribute
- end
- end
attr_writer:表示属性只写。它只创建修改属性的方法。不能从外部访问该属性该方法自动创建如下方法:
ruby 代码
- class name
-
- def attribute=(att)
- attribute=att
- end
- end
ruby 代码
- class name
-
- def attribute
-
- attribute
- end
-
- def attribute=(att)
- attribute=att
- end
- end
二、实例变量,类变量
1、实例变量
Ruby规定实例变量是以@开头,后跟一个名字。对实例变量的访问注意
a、在类内部可以对其赋值和读取没有限制
b、类外不能直接访问对象的实例变量,只能通过方法访问。正如上面所说的属性访问方式一样。
c、实例变量在使用前不用必须初始化。
2、类变量
Ruby规定类变量是以两个@@开头,后跟一个名字。对于一个给定的类而言,类变量只存在一份拷贝。
注意:
1、类变量必须在使用之前要初始化。
2、类变量是私有的。要想能从类外部访问,必须定义方法访问。这个方法是一个实例方法,要么是一个类方法。
3、通常类变量属于包含该变量的最内层的类或模块。但是,可以为被定义该变量的类的所有子类所共享
三、类常量
Ruby 的常量也是对对象的引用,常量通常在第一次被赋值的时候创建(通常是在类或模块中定义)。和其他语言不一样,
Ruby允许改变常量的值,因为常量是对对象的引用,通过改变常量的值,可以改变它所引用的对象的内部状态。
1、在类或模块中的任何位置都可以直接访问该类或模块中定义的常量。
2、在类或模块外,可以通过在域作用符::前加上一个返回适当类或模块对象的表达式来访问。
3、对于不属于任何类或模块的常量,可以直接访问或使用不带前缀的域作用符来访问
4、通过在常量名之前使用类或模块名和域作用符,还可以将常量从外面添加到已存在的类或模块中。
注意:
1、类名本身就是常量。这就意味着可以把类和其他Ruby对象一样对待:可以拷贝它们;将它们作为参数传入方法;或者在表达式中使用它们
2、如果一个无名的类赋值给了一个常量。Ruby将常量作为类名。
attr_accessor: 该方法自动创建两个方法,一个用于读取属性值,一个用于修改属性值四、方法
1、实例方法
实例方法的定义就是通常的方法定义。其作用域就是每个特定的对象。用于访问该对象的内部状态和行为。
实例方法的定义是保存在对象所属类对象的定义中。如果没有,就到类对象的父类对象中查找。依次类推
2、类方法
在方法名前放置类名以及一个点,来定义类方法
def classname.methodname
.....
end
类方法的定义是保存在类对象的虚拟类中。当调用类方法时,是到虚拟的类中寻找。如果没有,就到虚拟类的父类中查找。依次类推。