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

时间:2016-06-03 15:52:39

标签: ruby inheritance testing methods

我已经编写了三到四个月的代码(从Python开始),而我刚刚因为Rails普及而进入Ruby。

为了帮助我建立对Ruby语言的理解,我一直在讨论Ruby Monk的问题。 Ruby Primer:Ascent 1.1 - 了解继承课程有以下问题:

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

以下是我的想法(注意:Ruby Monk决定使用拼写" klass" for" 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匹配的测试。

1 个答案:

答案 0 :(得分:1)

他们可能不希望您使用mapinclude?,因为它们不是课程方法。它们是数组的方法。

我想这会通过测试。

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

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

顺便说一下,如果你可以直接比较课程,不要比较他们的名字。原始代码可以优化为

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