有没有更优雅的方式在Ruby中编写我的对象分层分析器?

时间:2012-08-03 14:21:41

标签: ruby

我正在学习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中编写这段代码?

4 个答案:

答案 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