2

我正在学习 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

4 回答 4

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)并出于同样的目的而写作。或等效Class === object使用Module#===

  • BasicObject.superclass返回nil的行为类似于false条件语句。所以当你建立一个递归函数时,你可以用它来终止。

于 2012-08-03T16:55:22.123 回答
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-space 制表符,并摆脱其中的一些括号。

你也可以做

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 我更喜欢第一个,它更具可读性。

于 2012-08-03T14:27:53.370 回答
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
于 2012-08-03T14:30:35.673 回答
1

这是我的:

def hierarchical_analyzer(obj)
  puts c = obj.class
  while c.respond_to? :superclass
    puts c = c.superclass
  end
end
于 2012-08-03T16:21:34.750 回答