我正在学习Ruby,我编写了一个简单的函数,它返回变量的元模型层次结构。
def hiearchicalanalyzer(victim)
if(victim.respond_to?('superclass'))
if(victim.superclass == BasicObject)
puts victim.superclass
else
puts victim.superclass
hiearchicalanalyzer(victim.superclass)
end
else
puts victim.class
hiearchicalanalyzer(victim.class)
end
end
hiearchicalanalyzer(5)
有没有更优雅的方式在Ruby中编写这段代码?
答案 0 :(得分:3)
def hiearchicalanalyzer(object)
puts klass = (Class === object) ? object : object.class
hiearchicalanalyzer(klass.superclass) if klass.superclass
end
没有必要仅使用object.respond_to?('superclass')
来确保该对象是类。由于类的类始终为Class
,因此您可以使用方法Object#is_a?并为同一目的编写object.is_a?(Class)
。或使用Module#===等效Class === object
。
BasicObject.superclass
返回nil
,其条件语句中的行为与false
相同。因此,当您构建递归函数时,可以将其用于终止。
答案 1 :(得分:1)
def hiearchicalanalyzer victim
if victim.respond_to?('superclass')
puts victim.superclass
if victim.superclass != BasicObject
hiearchicalanalyzer(victim.superclass)
end
else
puts victim.class
hiearchicalanalyzer(victim.class)
end
end
..一个简单的简化。您可以为if
语句添加一个内容,但IMO不是更“优雅”。还尝试使用2个空格的标签,并摆脱其中一些parens。
您也可以
def hiearchicalanalyzer(victim)
unless victim.respond_to?('superclass')
puts victim.class
hiearchicalanalyzer(victim.class)
return
end
puts victim.class
hiearchicalanalyzer(victim.superclass) unless victim.superclass == BasicObject
end
IMO我更喜欢第一个,它更具可读性。
答案 2 :(得分:1)
这是我的版本:)
def hiearchicalanalyzer(victim)
return unless victim && victim != BasicObject
target = if victim.respond_to?(:superclass)
victim.superclass
else
victim.class
end
puts target
hiearchicalanalyzer target
end
答案 3 :(得分:1)
这是我的:
def hierarchical_analyzer(obj)
puts c = obj.class
while c.respond_to? :superclass
puts c = c.superclass
end
end