我已经编码了三四个月(从 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 匹配的测试。
最佳答案
也许他们不希望您使用 map
和 include?
因为它们不是类的方法。它们是数组的方法。
我想这应该可以通过测试。
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/