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
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? –
Es ist "ein Weg", es zu tun. Es gibt mehrere, aber das sieht gut aus für mich. – Biketire
@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 ... –