2.2Ruby类型之类(Class)

1.类声明

总是以关键字 class 开始,后跟类的名称。

class User
end

2.继承

Ruby语言只提供单继承,就是说1个子类不可以继承多个父类,只可以继承1个父类,可以用mix-in的方式引入模块从而支持“多继承”的效果。

class 类名 < 父类名
  类定义
end

Class是Module的子类,Module是Object的子类,Object是BaseObject的子类,BaseObject是所有类的根类。

irb(main):001:0> p Class.superclass
Module
=> Module
irb(main):002:0> p Module.superclass
Object
=> Object
irb(main):003:0> p Object.superclass
BasicObject
=> BasicObject
irb(main):004:0> p BasicObject.superclass
nil
=> nil

3.抽象(Abstract)类

我们可以定义一个抽象类,在抽象类内部定义一些抽象方法,这些方法留待子类进行实现。抽象的反面是 具体(concrete) ,如果一个继承自抽象类的类实现了祖先类中的所有的抽象方法,它就是具体类。

class AbstractGreeter
  def greet
    puts "#{greeting} #{who}"
  end
end
class WorldGreeter < AbstractGreeter
  def greeting
    "Hello"
  end

  def who
    "World"
  end
end
WorldGreeter.new.greet     #Hello World

4.重写(Override)

当一个子类从父类继承的时候,可以在子类定义与父类同名的方法来覆盖父类的方法,以达到方法重写的功能。

class WorldGreeter
  def greet
    puts "#{greeting} #{who}"
  end

  def greeting
    "Hello"
  end

  def who
    "World"
  end
end
class SpanishWorldGreeter < WorldGreeter
  def greeting
    "Hola"
  end
end
SpanishWorldGreeter.new.greet   #Hola World

5.构造方法

def initialize(x,y)
    @x, @y = x, y
  end

6.创建对象

对象是类的实例,使用 new 方法创建对象。下面的示例创建了类 User 的两个对象 user1 和 user2:

user1 = User.new
user2 = User.new

使用new方法创建对象的时候,许多其他语言通过自动调用一个“构造函数(constructor)“来实现初始化对象的,而Ruby则是通过自动调用一个initialize方法实现初始化对象的,new方法会把实参原封不动地传给initialize方法的myname形参,将传递过来的参数赋值给@name实例变量,然后执行实例方法hello。

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

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

bob = HelloWorld.new("Bob")
bob.hello

7.访问成员

类.类变量
类.类方法()

对象.实例变量
对象.实例方法()

上面的对象被称为接收者(receiver)。调用方法被称为“向对象发送消息(message)”,调用的结果是“对象接收(receive)了消息”。也就是说,方法的调用就是把几个参数组成的消息一起发送给对象的过程。

8.访问器方法(Accessor)

由于initialize方法是private,所以Ruby类的实例变量不可以使用对象调用的方式直接被读取或修改,只能在实例方法中读取或修改,所以可以通过getter或setter实例方法分别读取和修改。

class MutablePoint
  def initialize(x,y)
    @x, @y = x, y
  end

  def x              #getter方法
    @x
  end

  def y              #getter方法
    @y
  end

  def x=(value)      #setter方法
    @x = value
  end

  def y=(value)      #setter方法
    @y = value
  end
end

给实例变量增加这种读写方法的需求俯拾皆是,但是以上的代码显得非常的繁琐,于是访问器方法应运而生。

class MutablePoint
  attr_reader :x, :y       #只读
  attr_writer :x, :y       #只写
  attr_accessor :x, :y     #读和写
  attr_:x                  #只读且只能定义一个属性             
  attr :y, true            #读和写且只能定义一个属性
end

9.self关键字

如果self在类的代码体中,但是在任何实例方法定义体外,self表示定义的当前类。

如果self在实例方法定义体内,self表示定义的当前实例。

10.superclass方法

当想知道某个子类(subclass)继承哪个父类(superclass),我们可以使用superclass方法。

File.superclass          #=> IO
IO.superclass            #=> Object
Object.superclass        #=> BasicObject
class Foo; end
class Bar < Foo; end
Bar.superclass           #=> Foo

当被给予的类没有父类时,将返回nil值。

BasicObject.superclass   #=> nil

注:父类(superclass)又称为超类,但笔者认为父类更贴切。

返回对象o的类

o.class

返回类c的超类

c.superclass

11.class方法

当想知道某个对象是哪个类的实例时,我们可以使用class方法。

irb(main):001:0> p "Hello world".class
String
=> String
irb(main):002:0> p 5.class
Integer
=> Integer
irb(main):003:0>

12.object_id方法

irb(main):001:0> :george.object_id == :george.object_id
=> true
irb(main):002:0> "george".object_id == "george".object_id
=> false
irb(main):003:0>

object_id 方法返回的是对象的身份标识。如果两个对象有相同的 object_id, 那么它们就是相同的(指向同一个内存地址)。 可以看出,当符号在使用过一次后,任何相同字符的符号都会在内存中指向同一个对象地址。 也就是说任何相同字符的符号的 object_id 都是相同的。

通过object_id方法判断字符串对象与符号对象是不是同一个对象,相同内容的字符串对象不是同一个对象,相同内容的符号对象是同一个对象。

ho@ho-Inspiron-N3010:~$ irb
3.2.0 :001 > p "string".object_id
4840
 => 4840 
3.2.0 :002 > p :"string".object_id
305628
 => 305628 
3.2.0 :003 > p "string".object_id
14060
 => 14060 
3.2.0 :004 > p :"string".object_id
305628
 => 305628 
3.2.0 :005 > 

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubylang/3317.html

(1)
上一篇 2023年1月2日 21:33
下一篇 2023年1月3日 02:28

相关推荐

  • 1.2Ruby语言的标识符(Identifier)和关键字(Keyword)

    1.标识符 标识符必须以字母(A~Z 和 a~z)或 下划线(_) 开头,后续可以是任何字母(A~Z 和 a~z)、数字(0~9)或 下划线(_)。标识符区分大小写。 2.命名约定 3.保留关键字 Ruby语言包含41个保留关键字。

    Ruby语言教程 2022年12月2日
    01.2K0
  • 1.1Ruby语言的注释(Comment)

    1.单行注释 2.多行注释 多行注释以=begin开头和以=end结尾。 3.文档注释 在多行注释的开头=begin后加上rdoc的注释。 4.魔法(magic)注释 单行注释#后面的内容通常会被 Ruby 忽略,但包含指令的特殊“魔法注释”不会被忽略,会影响代码的解释方式。 魔法注释必须出现在文件的第一个注释部分,只…

    Ruby语言教程 2022年12月1日
    01.2K0
  • 2.7Ruby语言的可见性(Visibility)

    在Ruby语言中,可见性可以是公开(public)、私有(private)或 被保护的(protected)。 1.类变量、实例变量、常量 可见性不可以应用于类变量、实例变量、常量,类变量、实例变量默认是private的,常量默认是public的。 2.实例方法 可见性可以应用实例方法。 如果没有明确声明为privat…

    Ruby语言教程 2023年1月7日
    0770

发表回复

登录后才能评论