如何获取对象名称?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
相关产品推荐
相关产品推荐

