Ruby 类与面向对象编程

发布: (2025年12月31日 GMT+8 12:41)
3 min read
原文: Dev.to

Source: Dev.to

基础类

class Test
  puts :Test.object_id.to_s
  def test
    puts :test.object_id.to_s
    @test = 10
    puts :test.object_id.to_s
  end
end

t = Test.new
t.test

构造函数与实例变量

class Dog
  def initialize(breed, name)
    # 인스턴스 변수
    @breed = breed
    @name = name
  end

  def bark
    puts 'Ruff! Ruff!'
  end

  def display
    puts "I am of #{@breed} breed and my name is #{@name}"
  end
end

d = Dog.new('Labrador', 'Benzy')

# 객체 ID 확인
puts "The id of d is #{d.object_id}."

# 메서드 존재 여부 확인
if d.respond_to?("talk")
  d.talk
else
  puts "Sorry, d doesn't understand the 'talk' message."
end

d.bark
d.display

# 객체 참조 복사
d1 = d
d1.display

# nil 참조 (이 시점에서 Dog 객체는 GC 대상)
d = nil

method_missing

处理不存在的方法调用。

class Dummy
  def method_missing(m, *args, &block)
    puts "There's no method called #{m} here -- please try again."
  end
end

Dummy.new.anything
# 출력: There's no method called anything here -- please try again.

为类添加方法

为已有类添加方法

require_relative 'p030motorcycle'
m = MotorCycle.new('Yamaha', 'red')
m.start_engine

class MotorCycle
  def disp_attr
    puts 'Color of MotorCycle is ' + @color
    puts 'Make of MotorCycle is ' + @make
  end
end

m.disp_attr
m.start_engine
puts self.class
puts self

为基础类添加方法

class String
  def write_size
    self.size
  end
end

size_writer = "Tell me my size!"
puts size_writer.write_size

继承

class Mammal
  def breathe
    puts "inhale and exhale"
  end
end

class Cat < Mammal
  def speak
    puts "Meow"
  end
end

rani = Cat.new
rani.breathe
rani.speak

方法覆盖

class Bird
  def preen
    puts "I am cleaning my feathers."
  end
  def fly
    puts "I am flying."
  end
end

class Penguin < Bird
  def fly
    puts "Sorry. I'd rather swim."
  end
end

p = Penguin.new
p.preen
p.fly

super 关键字

class Dog
  def initialize(breed)
    @breed = breed
  end
end

class Lab < Dog
  def initialize(breed, name)
    super(breed)
    @name = name
  end

  def to_s
    "(#@breed, #@name)"
  end
end

puts Lab.new("Labrador", "Benzy").to_s

抽象类

class AbstractKlass
  def welcome
    puts "#{hello} #{name}"
  end
end

class ConcreteKlass < AbstractKlass
  def hello; "Hello"; end
  def name; "Ruby students"; end
end

ConcreteKlass.new.welcome  # "Hello Ruby students"

访问控制

class ClassAccess
  def m1          # public
  end

  protected
    def m2        # protected
    end

  private
    def m3        # private
    end
end

# 또는
class ClassAccess
  def m1
  end
  public :m1
  protected :m2, :m3
  private :m4, :m5
end

查看类结构

# 메서드 구조 확인
puts self.private_methods.sort
s.class

# 부모 클래스 확인
a = [1, 2, 3, 4]
print a.class.ancestors

# Object ID
puts "string".object_id
puts "string".object_id  # 다른 ID

最初发布于 https://dss99911.github.io

Back to Blog

相关文章

阅读更多 »