Ruby 创建类

2017-10-20  本文已影响8人  changsanjiang

先看示例:

class HelloWorld                         # class 语句
  def initialize(name = "Ruby")          # initialize 方法
    @name = name                         # 初始化实例变量
  end

  def hello                              # 实例方法
    puts "Hello, World! I am #{@name}"
  end
end

sanJiang = HelloWorld.new("sanJiang")
sanJiang.hello

class 语句

class 语句在定义类时使用, 以下是 class语句的一些用法.

class 类名 
  类的定义
end

类名的首字母必须大写.


initialize 方法

在 class 语句中定义的方法为该类的实例方法. 上述代码中的hello也是实例方法.
其中, initialize比较特别. 使用new方法生成新的对象时, initialize方法会被调用, 同时new方法的参数也会被原封不动地传给initialize方法. 因此初始化对象时需要的处理一般都写在这个方法中.

def initialize(name = "Ruby")    # initialize 方法
  @name = name      # 初始化实例变量
end

在上述代码中, initialize 方法接收了参数 name. 因此, 像下面这样生成对象, 就可以把 Bob 传递给 initialize 方法.

bob = HelloWorld.new("Bob")

由于 initialize 方法的参数指定了默认值"Ruby". 因此, 像下面这样的没有指定参数时, 就会自动把"Ruby"传给 initialize 方法.

ruby = HelloWorld.new

实例变量与实例方法

我们回过头来看看 initialize 方法

def initialize(name = "Ruby")    # initialize 方法
  @name = name      # 初始化实例变量
end

通过 @name = name 这行程序, 作为参数传进来的对象会被赋值给变量 @name. 我们把以 @ 开头的变量称为实例变量. 在不同的方法中, 程序会把局部变量看做是不同的变量来对待. 而只要在同一个实例中, 程序就可以超越方法定义, 任意引用, 修改实例变量的值. 另外, 引用未初始化的实例变量时的返回值为nil.

不同实例的实例变量值可以不同. 只要实例存在, 实例变量的值就不会消失, 并且可以被任意使用. 而局部变量则是在调用方法时被创建, 而且只能在该方法内使用.

我们来看看下面的例子:

bob = HelloWorld.new("Bob")
tom = HelloWorld.new("Tom")
ruby = HelloWorld.new

bob, tom, ruby 各自拥有不同的@name.
我们可以调用最初定义的 hello 方法, 来输出 实例变量 @name 的值.

bob.hello  #=> Hello, World! I am Bob
tom.hello  #=> Hello, World! I am Tom
ruby.hello #=> Hello, World! I am Ruby

存取器

在 Ruby中, 从对象外部不能直接访问实例变量或对实例变量赋值, 需要通过方法来访问对象的内部.
为了访问 HelloWorld 类中的 @name 实例变量, 需要定义一下方法.

class HelloWorld
  def name
    @name    # 获取 @name 值
  end

  def name=(value)
    @name = value    # 修改 @name 的值
  end
end

第一个方法 name 只是简单地返回 @name 的值. 我们可以像访问属性一样使用该方法.

bob = HelloWorld.new("Bob")
bob.name #=> "Bob"

第二个方法的方法名为 name=, 使用方法如下:

bob.name = "Robert"

乍一看, 该语法很像是在给对象的属性赋值, 但实际却是在调用 name=("Robert") 这个方法. 利用这样的方法, 我们就可以突破 Ruby 原有的限制, 从外部自由地访问对象内部的实例变量了.
当对象有多个实例变量时, 如果逐个定义存取器, 就会是程序变的难懂, 而且也容易写错. 为此, Ruby 为我们提供了更简便的定义方法 attr_reader, attr_writer, attr_accessor. 只要指定实例变量名的符号, Ruby就会自动帮我们定义相应的存取器.


Ruby 中, 一般把设定实例变量的方法称为 writer, 读取实例变量的方法称为 reader, 合起来称 accessor. 有时候也把 reader 称为 getter, writer 称为 setter, 合称 accessor method.

定义 意义
attr_reader :name 只读(定义 name 只读方法)
attr_writer :name 只写(定义 name= 方法)
attr_accessor :name 读写(定义 以上两个方法)

so

class HelloWorld

attr_accessor :name
# 一句顶下面好几句
#  def name
#    @name    # 获取 @name 值
#  end
#  def name=(value)
#    @name = value    # 修改 @name 的值
#  end
end
上一篇 下一篇

猜你喜欢

热点阅读