2016-12-01 3 views
1

Ich möchte auf das Attribut Schaukeln des Ogerobjekts aus der Klasse des Menschen zugreifen. Aber alles, was ich bekomme, ist: NameError: undefined local variable or method ogre for **<Human:0x007fdb452fb4f8 @encounters=3, @saw_ogre=true> Höchstwahrscheinlich eine einfache Lösung, und mein Gehirn funktioniert heute Morgen einfach nicht. Ich führe Tests mit Minitest durch. Die Test- und Klassen sind unter:attr_accessor - Zugreifen auf Objekte Attribute aus einer anderen Klasse

ogre_test.rb

def test_it_swings_the_club_when_the_human_notices_it 
    ogre = Ogre.new('Brak') 
    human = Human.new 
    ogre.encounter(human) 
    assert_equal 0, ogre.swings 
    refute human.notices_ogre? 

    ogre.encounter(human) 
    ogre.encounter(human) 

    assert_equal 1, ogre.swings 
    assert human.notices_ogre? 
end 

ogre.rb

class Ogre 
    attr_accessor :swings 
    def initialize(name, home='Swamp') 
    @name = name 
    @home = home 
    @encounters = 0 
    @swings = 0 
    end 

    def name 
    @name 
    end 

    def home 
    @home 
    end 

    def encounter(human) 
    human.encounters 
    end 

    def encounter_counter 
    @encounters 
    end 

    def swing_at(human) 
    @swings += 1 
    end 

    def swings 
    @swings 
    end 
end 


class Human 

    def initialize(encounters=0) 
    @encounters = encounters 
    @saw_ogre = false 
    end 

    def name 
    "Jane" 
    end 

    def encounters 
    @encounters += 1 
    if @encounters % 3 == 0 and @encounters != 0 
     @saw_ogre = true 
    else 
     @saw_ogre = false 
    end 
    if @saw_ogre == true 
     ogre.swings += 1 # <----issue 
    end 
    end 

    def encounter_counter 
    @encounters 
    end 

    def notices_ogre? 
    @saw_ogre 
    end 
end 

Antwort

0

Die einfache Lösung des Oger-Objekt als Argument an encounters passieren würde - vorausgesetzt, encounters isn Ich habe es nirgendwo anders gebraucht ohne das Argument.

class Ogre 
    ... 

    def encounter(human) 
    human.encounters(self) 
    end 

    ...  
end 


class Human 
    ... 

    def encounters(ogre) 
    @encounters += 1 
    if @encounters % 3 == 0 and @encounters != 0 
     @saw_ogre = true 
    else 
     @saw_ogre = false 
    end 
    if @saw_ogre == true 
     ogre.swings += 1 # <----issue 
    end 
    end 

    ... 
end 
+0

DANKE! Also, da ich das Argument nicht weitergegeben habe, konnte es nicht verwendet werden. War die Grundlage dafür, wie ich versuchte, attr_accessor theoretisch korrekt zu verwenden? –

+0

Es ist "ein Weg", es zu tun. Es gibt mehrere, aber das sieht gut aus für mich. – Biketire

+0

@Prodigy_Internet: Wie diese Antwort erklärt, hatten Sie ein einfaches Problem mit dem Bereich. Der 'attr_accessor' geht gar nicht erst ins Bild. Aber da Sie fragen: Nein, das ist absolut schrecklich. Sie erlauben jedem, den Wert von "Swings" beliebig zu ändern, indem Sie ihm eine beliebige Zahl zuweisen. Es ist nicht ganz klar, was du mit diesen Informationen erreichen willst, aber hier sind zwei Ideen: Wenn du es benutzt, um zu überprüfen, ob der Oger müde ist, kann ich einfach jeden Kampf gewinnen, indem ich ihn zuerst auf einen lächerlich hohen Wert setze. Wenn Sie damit rechnen, wie oft der Oger mich getroffen hat, kann ich ... –

Verwandte Themen