美文网首页
Ruby 创建类

Ruby 创建类

作者: changsanjiang | 来源:发表于2017-10-20 21:41 被阅读8次

    先看示例:

    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
    

    相关文章

      网友评论

          本文标题:Ruby 创建类

          本文链接:https://www.haomeiwen.com/subject/skfbuxtx.html