2012-02-21 11 views
0

は、私はそれがそのオブジェクト上でその操作のためのアイデンティティ要素何知りたいのですrespond_to? :+という特定のオブジェクトを考えます。例えば、a場合Fixnumは、それがどんなFixnumのための操作:+ためa + 0 == aため0を与えるべきです。もちろん、私はすでにFixnumについて話しているときに:+:*のアイデンティティ要素を知っていますが、すべての数値型と演算に対してそれらを動的に取得する標準パターン/イディオムはありますか?操作のためのアイデンティティ要素(0,1)を取得する任意のイディオムはありますか?

具体的には、グラフの各辺のコスト/距離/重さがユーザー指定の型で指定されているv1とv2(グラフの頂点)間の最短経路を計算するコードを書きました(下記参照) 。現在の実装では、辺のコスト/重みはFixnum,FloatまたはComparableを実装し、0を追加してselfを返すことができます。

しかし、私は最高のパターンであると思いまして:使用されているタイプを必要と

  • は、そのタイプがa.class :: ADDITION_IDENTITY_ELEMENT
  • ほかのアイデンティティ要素の発見」のいくつかの種類を提供必要 a + 0 == a
  • をサポートしている必要があります

マイDijkstra algorithm implementation

def s_path(v1,v2) 
    dist = Hash.new { nil} 
    pred = {} 
    dist[v1] = 0 # distance from v1 to v1 is zero 
    #pq = nodes 
    pq = [v1] 

    while u = pq.shift 
     for edge in from(u) 
     u,v,cost = *edge 
     new_dist = cost + dist[u] 
     if dist[v].nil? or new_dist < dist[v] 
      dist[v] = new_dist 
      pred[v] = u 
      pq << v 
     end 
     end 
    end 
    path = [v2] 
    path << pred[path.last] while pred[path.last] 
    path.reverse 
    end 

答えて

1

私はa.class::Zeroそれを呼ぶだろう以外a.class::ADDITION_IDENTITY_ELEMENTはかなり良いと思います。

もう1つのオプションは(a-a)です。

個人的に私は抽象的なものを作ろうとはせず、すべての距離がNumeric(たとえば、FloatまたはInteger)であることを要求しています。次に、あなただけの0を使用し続けることができます。

関連する問題