Ruby on Rails 入门之:(12) Ruby中的类变量、属性以及构造函数
1. 实例变量和类变量
Ruby系统提供了两种存放共享数据的变量,就是实例变量和类变量
1.1 实例变量
实例变量用于在类的内部共享数据。
在程序文件的顶层定义的实例变量对整个应用程序中顶层的表达式和函数都有效;在类和模块中定义的实例变量可以被当前类或模块中的表达式访问;在类方法中声明的实例变量可以被当前类下的所有方法使用。
定义类的实例变量以@符号开头。
在方法或者函数中声明的实例变量,只有在方法调用后才有效。
[ruby]
#encoding:gbk
class Animal
@color = "red";
def init
@name = "animal";
end
def show
puts "#@color";
puts "#@name";
end
end
a = Animal.new
a.show;
a.init;
puts "******************************";
a.show;
#encoding:gbk
class Animal
@color = "red";
def init
@name = "animal";
end
def show
puts "#@color";
puts "#@name";
end
end
a = Animal.new
a.show;
a.init;
puts "******************************";
a.show;
看一下输出结果:
[html]
watkins@watkins:~/temp/workspace/ruby$ ruby class3.rb
******************************
animal
watkins@watkins:~/temp/workspace/ruby$
watkins@watkins:~/temp/workspace/ruby$ ruby class3.rb
******************************
animal
watkins@watkins:~/temp/workspace/ruby$
第一次输出的时候,什么都没有,可以看到在show方法中不能访问类中定义的实例变量。这个让我觉得有点别扭。。。
在方法中定义的实例变量,只有方法被调用以后才可以使用。
1.2 类变量
类变量可以在各个类之间共享数据,类变量以@@开头。
[ruby]
#encoding:gbk
@@master = "watkins";
class Animal
@color = "red";
def init
@name = "animal";
end
def show
puts "#@color";
puts "#@name";
puts "master is #@@master"
end
end
a = Animal.new
a.show;
a.init;
puts "******************************";
a.show;
class Cat
def show
puts "master is #@@master";
end
end
c = Cat.new
c.show;
#encoding:gbk
@@master = "watkins";
class Animal
@color = "red";
def init
@name = "animal";
end
def show
puts "#@color";
puts "#@name";
puts "master is #@@master"
end
end
a = Animal.new
a.show;
a.init;
puts "******************************";
a.show;
class Cat
def show
puts "master is #@@master";
end
end
c = Cat.new
c.show;
类变量往往使用在整个应用程序范围内,通常保存一些程序级的配置性信息,他的修改将会影响整个应用程序的运行结果。
2. 类的属性
2.1 类属性
如果要为类的实例变量追加一个设置器,要为其创建一个设置方法。
设置实例变量值的属性方法比较特殊,命名的时候需要用=作为后缀,而且必须设置一个方法参数。
[ruby]
#encoding:gbk
@@master = "watkins";
class Animal
@color = "red";
def init
@name = "animal";
end
def show
puts "#@color";
puts "#@name";
puts "master is #@@master"
end
def name=(val)
@name = val;
end
end
a = Animal.new
a.show;
a.init;
puts "******************************";
a.show;
puts "******************************";
a.name = "aaaaaaaaaaaaa";
a.show;
puts "******************************";
class Cat
def show
puts "master is #@@master";
end
end
c = Cat.new
c.show;
#encoding:gbk
@@master = "watkins";
class Animal
@color = "red";
def init
@name = "animal";
end
def show
puts "#@color";
puts "#@name";
puts "master is #@@master"
end
def name=(val)
@name = val;
end
end
a = Animal.new
a.show;
a.init;
puts "******************************";
a.show;
puts "******************************";
a.name = "aaaaaaaaaaaaa";
a.show;
puts "******************************";
class Cat
def show
puts "master is #@@master";
end
end
c = Cat.new
c.show;
2.2 属性标识符
在Ruby中,定义属性的标识符有4个,分别是attr, attr_reader, attr_writer, attr_accessor,这些不是Ruby的关键字,而是一些内建的方法,使用语法如下:
attr :attr1, key
attr_reader :attr1, :attr2
attr_writer :attr1, :attr2
attr_accessor :attr1, :attr2
这里的:attr1是类中实例变量的名称,不过这里要把实例变量的前缀@换成冒号“:”,相当于符号变量,所以说这几个标识符是方法而不是关键字,因为他们使用符号变量作为了函数参数。
具体说明:
attr :根据布尔值数据key的值,定义一个可读写的属性,如果key为false,则设置访问权限为只读。
attr_reader: 定义一个或多个只读的属性
attr_writer: 定义一个或多个只写的属性
attr_accessor: 定义一个或多个读写的属性
3. 构造函数
Ruby的构造函数统一为initialize方法,当调用new获取一个新的对象的时候,就会自动的调用这个构造函数来初始化该对象。
[ruby]
#encoding:gbk
@@master = "watkins";
class Animal
@col
补充:Web开发 , 其他 ,