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 の class は alwaysClassであるため、メソッドObject#is_a?を使用できます。object.is_a?(Class)同じ目的で書きます。またはModule#===Class === objectを使用して同等。

  • 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

..1つの簡単な簡略化。そのステートメントにワンライナーを入れることもできますがif、IMOはそれほど「エレガント」ではありません。また、2スペースのタブを使用して、それらの親の一部を削除してみてください。

あなたもすることができます

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 hierarchical_analyzer(obj)
  puts c = obj.class
  while c.respond_to? :superclass
    puts c = c.superclass
  end
end
于 2012-08-03T16:21:34.750 に答える
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 に答える