• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Ruby学习: 类的定义和实例变量

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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中类的实例变量的操作更加灵活和清晰。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ruby第五次作业part1(分类、排序)发布时间:2022-07-13
下一篇:
ruby中的module发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap