2017-09-17 10 views
1

Je suis autodidacte Ruby pour l'un de mes cours et ne peux pas envelopper ma tête autour d'un bug que j'ai rencontré. Note: Je ne demande à personne de faire mon projet pour moi; me demandais si quelqu'un pouvait me donner un aperçu sur ceClonage dans Ruby via Marshaling ne fonctionne pas

L'essentiel:

  • Il existe une classe Set, qui a un ensemble d'éléments d'abonné
  • La classe d'abonné lit dans un fichier .csv et pousse Nouvel objet abonné au tableau d'abonné d'un objet Set
  • J'essaie de trouver l'union et l'intersection de deux ensembles
  • En utilisant marshaling, j'ai réussi à faire fonctionner la méthode union, mais en suivant la même conception, Je ne peux pas obtenir la logique d'intersection travailler

La méthode de la classe Set deepCopy:

def deepCopy(toCopy) 
    Marshal.load(Marshal.dump(toCopy)) 
end 

La méthode de la classe Set union (cela fonctionne):

def union(set2) 
    # clone the current set into union set 
    unionSet = Set.new 
    unionSet.deepCopy(self) 

    # iterate through set 2 and append all unique elements to union set 
    set2.subscribers.each do |sub| 
    if !unionSet.subscribers.include?(sub) 
     unionSet.subscribers.push(sub) 
    end 
    end 
    unionSet.printSet 
end 

La méthode Set classe Intersection (cela ne fonctionne pas):

def intersection(set2) 
    intersectionSet = Set.new 
    comparisonSet = Set.new 
    otherSet = Set.new 

    # choose the smallest set for the comparison set 
    if @subscribers.size < set2.subscribers.size 
    comparisonSet.deepCopy(self) 
    otherSet.deepCopy(set2) 
    else 
    comparisonSet.deepCopy(set2) 
    otherSet.deepCopy(self) 
    end 

    #PROBLEM: Both statements below print nothing and both say they are empty when checked. 
    intersectionSet.printSet 
    comparisonSet.printSet 

    # iterate through the comparison set and store all commonalities in intersection set 
    comparisonSet.subscribers.each do |sub| 
    puts "Looking for #{sub}" 
    if otherSet.subscribers.include?(sub) 
     intersectionSet.subscribers.push(sub) 
    end 
    end 
    intersectionSet.printSet 
end 
end 

C'est un projet assez basique, mais apprendre les nuances de Ruby rend la chose plutôt difficile. J'ai même essayé de cloner self dans la méthode intersection comme je l'ai fait dans union, mais cela n'a pas fonctionné non plus. Cela me fait me demander si c'est une sorte de problème de mémoire?

+1

Je recommanderais de réduire votre problème aux parties les plus simples à reproduire et d'ajuster votre question en conséquence. Votre échantillon de code est incomplet, il n'a pas été expliqué correctement. – anothermh

+0

@anothermnh Y at-il quelque chose de spécifique que vous trouvez vague? J'essayais d'éviter d'afficher le code source entier – shanleo1

Répondre

0

Vous n'êtes pas initialisez vos jeux ici:

if @subscribers.size < set2.subscribers.size 
    comparisonSet.deepCopy(self) 
    otherSet.deepCopy(set2) 
    else 
    comparisonSet.deepCopy(set2) 
    otherSet.deepCopy(self) 
    end 

La valeur retournée est non affecté aux jeux. Cela devrait ressembler à comparisonSet = self.deepCopy(self). Vous pouvez voir l'appel de méthode ici a des informations redondantes. Je vous suggère de changer votre #deepCopy à

def deep_copy # use snake case as per ruby convention 
    Marshal.load(Marshal.dump(self)) 
end 

Ensuite, vous pouvez faire quelque chose comme:

comparison_set = self.deep_copy 
other_set = set2.deep_copy 

Votre implémentation actuelle fonctionne avec le syndicat, car l'ensemble des syndicats commence comme un ensemble vide, et prend à tous les abonnés que vous jetez à cela. En passant, je ne suis pas sûr que vous ayez besoin de faire la copie ici. On dirait que vous pouvez vous en passer. Mais bien sûr, je n'ai pas vu tout votre code.

+0

Cela l'a fait, merci une tonne! – shanleo1