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