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

标签 ruby inheritance testing methods

我已经编码了三四个月(从 Python 开始),由于 Rails 的流行,我才开始接触 Ruby。

为了帮助加深对 Ruby 语言的理解,我一直在研究 Ruby Monk 上的问题。 Ruby Primer: Ascent 1.1 - Understanding Inheritance 类(class)存在以下问题:

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

这是我的想法(注意:Ruby Monk 决定将“class”拼写为“klass”):

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

这段代码通过了所有测试,除了一个特殊的测试,该测试声明没有使用任何其他方法来解决问题(是的,有一个捷径:))

我很苦恼如何在不使用其他方法的情况下解决这个问题,所以我查看了建议的解决方案。以下是 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

关于Ruby Monk - 了解继承 - 不接受替代解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618722/

相关文章:

ruby - 将字符串读入数组/子数组

ruby-on-rails - 使用电子表格 gem 导出 Excel 文件

java - 扩展三角形文件

asp.net - 如何在不添加到 ASPX 文件的情况下测试用户控件?

testing - Gemini 和 SpiraTest 交互

java - 非测试设置中的 Wiremock

ruby - Ruby 1.9.3-p392+ 中的 SSL 连接错误

ruby - 是否有用于 Ruby(如 JAXB)的 XML 绑定(bind)库?

entity-framework - 首先使用抽象类进行代码,无法生成 fk

java - 使用构造函数重载和带有继承的预先存在的静态对象