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

Ruby面向对象代码:如何实现指定输出并返回最后一行变量

问题解答

1. 让puts anna.equal?(gilles)输出true

Ruby里equal?默认比较对象的内存地址,不同实例会返回false。要实现名字相同的Human实例equal?返回true,需要:

  • 先在initialize方法中给@name赋值,让实例能存储名字;
  • 重写equal?方法,基于name的值判断相等性;
  • 同步重写hash方法,保证相等对象的哈希值一致(这是Ruby对象相等性的规范要求)。

修正后的类代码片段:

class Human
  attr_reader :name 

  def initialize(name)
    @name = name # 初始化时为实例变量赋值
  end

  def equal?(other)
    # 先判断对方是否为Human实例,再比较名字
    other.is_a?(Human) && name == other.name
  end

  def hash
    name.hash # 基于name生成哈希值
  end
end

2. 让puts anna + gilles输出annagilles

需要在Human类中定义+方法,接收另一个Human实例,返回两个实例name拼接后的字符串:

在类中添加以下方法:

def +(other)
  name + other.name
end

注意:原代码中anna = Human.new("gilles")的名字是"gilles",要输出annagilles,需要把anna的初始化参数改成"anna"。

3. 返回代码最后一行的变量

原代码最后一行是puts anna + gilles,puts方法的返回值是nil。如果要获取拼接后的字符串变量,有两种方式:

  • 将拼接结果存入变量,后续可直接返回该变量:
    result = anna + gilles
    puts result
    result # 这行会返回拼接后的"annagilles"
    
  • 直接去掉puts,anna + gilles本身就会返回拼接后的字符串,此时最后一行的表达式结果就是该字符串。

完整修正代码

class Human
  attr_reader :name 

  def initialize(name)
    @name = name
  end

  def equal?(other)
    other.is_a?(Human) && name == other.name
  end

  def hash
    name.hash
  end

  def +(other)
    name + other.name
  end
end

gilles = Human.new("gilles") 
anna = Human.new("anna") # 修正初始化名字以满足输出要求

puts anna.equal?(gilles) # 名字不同,输出false;若anna初始化名字为"gilles"则输出true
puts anna + gilles # 输出annagilles

# 返回拼接结果的示例
result = anna + gilles
result # 返回"annagilles"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:15:43