难以理解涉及超类的名为 "Whodunnit" 的 RubyMonk 练习

Difficulty understanding RubyMonk exercise called "Whodunnit" involving superclasses

我正在尝试了解 RubyMonk 练习的解决方案。我可以遵循大部分代码,但不能遵循以下行,

while not (superclass = klass.superclass).nil?

这是在创建一个名为 'superclass' 的变量以用于 'while not loop' 的其余部分,然后同时将其测试为 != nil 吗?

完整解决方案

def location_in_hierarchy(object, method)
  klass = object.class
  ancestors = [klass]
  while not (superclass = klass.superclass).nil?
    ancestors << superclass
    klass = superclass
  end
  ancestors.reverse.find do |ancestor| 
    ancestor.instance_methods.include?(method)
  end
end

link to exercize

我已经学习 Ruby 几个星期了。但在过去的一个小时里,我一直在关注这个解决方案。如果能帮助理解这一行,我们将不胜感激。

您可以在irb中进行测试。如果对象是 'a':

irb(main):009:0> 'a'.class
=> String
irb(main):010:0> 'a'.class.superclass
=> Object
irb(main):011:0> Object.superclass
=> BasicObject
irb(main):013:0> BasicObject.superclass
=> nil

所以如果klass.superclass为零(klass为零),循环将结束。

  while not (superclass = klass.superclass).nil?
    ancestors << superclass
    klass = superclass
  end

你可以这样理解:

   superclass = klass.superclass
   while not superclass.nil?
    ancestors << superclass
    klass = superclass
    superclass = klass.superclass
  end

正如你所说,它创建了一个名为'superclass'的变量,然后检查它是否为nil,如果为nil,则while()循环结束,或者将klass.superclass赋值给它。

is this creating a variable called 'superclass' to use in the rest of the 'while not loop', and then testing it as != nil, at the same time?

是的。 (blahblah).nil? 是循环条件,而 superclass 的值在每次迭代中使用。

while not (superclass = klass.superclass).nil?

它只是遍历 object 的所有父 类(祖先)的一种方式。循环将 运行 直到 superclass == BasicObject(即 klass.superclass == nil),并且在每次迭代中每个超类的名称被推入 ancestors