理解 Ruby 中的类 << self

Nurudeen Ibrahim 2023年1月30日
  1. Ruby 中的实例方法和类方法
  2. Ruby 中的 singleton 方法
理解 Ruby 中的类 << self

在 Ruby OOP 中,class << self 是你经常遇到的语法。它通常用于定义类方法。

在本文中,我们将了解 class << self 语法以及为什么使用它来定义类方法。

Ruby 中的实例方法和类方法

实例方法和类方法是 Ruby 最常见的两种方法类型。

示例代码:

class Employee
  def initialize(last_name, first_name)
    @last_name = last_name
    @first_name = first_name
  end

  def full_name
    "#{@first_name} #{@last_name}"
  end

  def self.company_name
    "Ruby LLC"
  end
end

employee1 = Employee.new("Mark", "David")
puts employee1.full_name
puts Employee.company_name

输出:

David Mark
Ruby LLC

full_name 是上面示例中的 instance 方法,company_nameclass 方法。full_name 特定于 Employee 的一个实例,而 company 应该为类的每个实例返回相同的值,定义为 self.company_name

示例中的 self 指的是类本身,因此,我们也可以将其写为:

class Employee
  def Employee.company_name
    "Ruby LLC"
  end
end

Ruby 中的 singleton 方法

还有另一种方法称为 singleton,它仅针对特定对象定义。它通常用于图形用户界面 (GUI) 设计,其中不同的元素需要采取不同的操作。

如下所示,我们可以为 employee1 对象编写一个单例方法。

示例代码:

class Employee
  def initialize(last_name, first_name)
    @last_name = last_name
    @first_name = first_name
  end

  def full_name
    "#{@first_name} #{@last_name}"
  end

  def self.company_name
    "Ruby LLC"
  end
end

employee1 = Employee.new("Mark", "David")

def employee1.responsiblity
  "Handle recruitment"
end

puts employee1.responsiblity

输出:

Handle recruitment

下面是上面代码的另一种写法:

示例代码:

class Employee
  def initialize(last_name, first_name)
    @last_name = last_name
    @first_name = first_name
  end

  def full_name
    "#{@first_name} #{@last_name}"
  end

  def self.company_name
    "Ruby LLC"
  end
end

employee1 = Employee.new("Mark", "David")

class << employee1
  def responsiblity
    "Handle recruitment"
  end
end

puts employee1.responsiblity

输出:

Handle recruitment

上面的例子是 class << self 发挥作用的地方,上面例子中的 self 指的是 employee1 对象。

因此,我们可以重写 Employee 类以使用 class << self 语法来定义其类方法。

示例代码:

class Employee
  def initialize(last_name, first_name)
    @last_name = last_name
    @first_name = first_name
  end

  def full_name
    "#{@first_name} #{@last_name}"
  end

  class << self
    def company_name
      "Ruby LLC"
    end
  end
end

employee1 = Employee.new("Mark", "David")
puts Employee.company_name

输出:

Ruby LLC

相关文章 - Ruby Class