Ruby Monk-理解继承-不接受替代解决方案



我已经编码三到四个月了(从Python开始),由于Rails的流行,我刚刚开始学习Ruby。

为了帮助我理解Ruby语言,我一直在研究Ruby Monk上的问题。Ruby Primer:Ascent 1.1-理解继承课程存在以下问题:

编写一个方法,将一个类和一个子类作为参数,并返回一个关于该子类是否是该类的祖先的布尔值

以下是我的想法(注:Ruby Monk决定将"klass"拼写为"class"):

def is_ancestor?(klass, subclass)
subclass.ancestors.map{ |ancestor| ancestor.to_s }.include? klass.to_s
end

除了状态为doesn't use any other methods to solve the problem (yes, there's a shortcut :))的特殊测试外,此代码通过了所有测试。

我真的很苦恼如何在不使用其他方法的情况下解决这个问题,所以我研究了拟议的解决方案。以下是Ruby Monk所说的答案。

def is_ancestor?(klass, subclass)
current_class = subclass
while !current_class.superclass.nil? && current_class != klass
current_class = current_class.superclass
end
current_class == klass
end

我理解这个代码。我不明白的是,为什么这段代码通过了不使用方法的测试要求,而我的代码却没有。毕竟,Ruby Monk提出的答案确实使用了方法(参见!current_class.superclass.nil)。

我是不是遗漏了什么?也许我真的不明白什么是方法。也许我的代码确实有效,只是因为Ruby Monk正在执行与代码1:1匹配的测试而失败。

也许他们不希望您使用mapinclude?,因为它们不是类的方法。它们是数组的方法。

我想这会通过测试的。

def is_ancestor?(klass, subclass)
subclass <= klass
end

严格来说,<=也是一种方法。

顺便说一句,如果你可以直接比较类,不要比较它们的名称。您的原始代码可以优化为

def is_ancestor?(klass, subclass)
subclass.ancestors.include? klass
end

相关内容

最新更新