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
相关产品推荐
相关产品推荐

