You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取对象名称?Ruby类方法存储实例名及排序问题

搞定:存储实例而非名称,实现按姓氏排序

嘿,先给你理清一个关键误区:如果你后续要按last_name对对象排序,绝对不能只存实例的名称字符串——因为字符串没有last_name属性供你排序用。你最初写的@@people << self其实是正确的方向,只是还没完善last_name的处理逻辑,咱们一步步来修正:

1. 补全last_name的赋值逻辑

你的Person类里定义了last_name的访问器,但初始化时没给它赋值!咱们可以根据全名拆分出姓氏,或者支持单独传入姓氏,先看最常用的“全名拆分”写法:

class Person
  attr_accessor :name, :years, :height, :work, :last_name
  @@people = []

  def initialize(full_name)
    @name = full_name
    # 从全名里拆分出姓氏(默认取空格分隔的最后一段)
    @last_name = full_name.split.last
    @@people << self  # 这里存整个实例才对,因为排序需要实例的last_name属性
  end

  # 实现比较运算符,让Ruby的sort方法能按姓氏排序
  def <=>(other)
    last_name <=> other.last_name
  end

  # 加个类方法,方便外部获取所有人员实例
  def self.all
    @@people
  end
end

2. 获取名称数组+按姓氏排序的用法

现在创建实例后,你既可以拿到所有实例的名称数组,也能轻松按姓氏排序后提取名称:

# 创建几个测试实例
Person.new("Alice Smith")
Person.new("Bob Johnson")
Person.new("Charlie Brown")

# 获取所有实例的名称数组
names_list = Person.all.map(&:name)
# 输出:["Alice Smith", "Bob Johnson", "Charlie Brown"]

# 按姓氏排序实例,再提取排序后的名称
sorted_names = Person.all.sort.map(&:name)
# 输出:["Charlie Brown", "Bob Johnson", "Alice Smith"]

为啥不能只存名称?

要是你一开始把@name存入数组,那数组里全是字符串,你没法直接从字符串里拿到last_name来排序——总不能每次排序都重新拆分字符串吧?既麻烦又容易出问题。直接存实例就方便多了,实例自带所有你需要的属性,想拿名称拿名称,想排序就排序,灵活得很。

额外优化:支持单独传入姓氏

要是你的姓名格式不固定,或者需要手动指定姓氏,那可以修改初始化方法,让用户分别传入名和姓:

def initialize(first_name, last_name)
  @name = "#{first_name} #{last_name}"
  @last_name = last_name
  @@people << self
end

创建实例时就这么写:

Person.new("Alice", "Smith")
Person.new("Bob", "Johnson")

这样姓氏的准确性更高,排序也更靠谱。

内容的提问来源于stack exchange,提问作者Boban Jankovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:57:47