难以理解RubyMonk练习,称为“Whodunnit”涉及超类

时间:2015-05-17 14:43:30

标签: ruby while-loop superclass

我正在尝试理解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几周了。但是我在最后一小时一直主演这个解决方案。理解这一行的任何帮助都将非常受欢迎。

2 个答案:

答案 0 :(得分:2)

你可以用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

答案 1 :(得分:1)

  

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

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

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

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