难以理解涉及超类的名为 "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
我已经学习 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
。
我正在尝试了解 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 几个星期了。但在过去的一个小时里,我一直在关注这个解决方案。如果能帮助理解这一行,我们将不胜感激。
您可以在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
。