2016-10-17 4 views
2

Ich bin ganz neu in Ruby und ich habe Probleme, eine Übung Finishing ich zu lösen versuchen. Es ist ein klassisches Game of Rooms, und nachdem ich ein bisschen durcheinander gekommen bin, habe ich einen Code entwickelt, der mir gut aussieht - minus, das funktioniert nicht.private Methode `wählt‘ genannt für # <Zimmer: 0x00000001f6f5f8> (NoMethodError)

Ich versuche, die Select-Methode innerhalb einer anderen Methode in einer Klasse aufrufen, auf was ich ziemlich sicher bin, ist es ein Array (@position), aber ich bekomme die obige Fehlermeldung.

Hier ist eine Probe von meinem Code, eine Idee auf, warum das .select privat ist willkommen!

class GameofRooms 
    attr_accessor :position 

    def initialize 
    @rooms = [ 
     Room.new("Red",{"s" => "Green", "e" => "Blue"},"it's a red room"), 
     Room.new("Blue",{"w" => "Red", "e" => "Patio", "s" => "Yellow"},"it's a blue room"), 
     Room.new("Yellow",{"e" => "Patio", "n" => "Blue", "w" => "Green"},"it's a yellow room"), 
     Room.new("Green",{"n" => "Red", "e" => "Yellow"},"it's a green room"), 
     Room.new("Patio",{"s" => "Green", "w" => "Blue"},"lovely garden") 
    ] 
    @position = @rooms[0]  
    end 


    def get_input_move 
    puts "Where would you like to go?" 
    @input = gets.chomp 
    if @position.exits.key?(@input) 
     roomName = @position.exits[@input] 
     room = @position.select {|selectedRoom| selectedRoom.name == roomName } 
     self.class.move(room) 
    elsif 
     puts "You can't go in that direction"   
    end 
    end 

    def self.move(room) 
    @position = room 
    @position.each do |room| 
     puts "You have entered the #{name} room. #{text}" 
    end 
    end 
end 

class Room 
    attr_accessor :name, :exits, :text 

    def initialize(name,exits,text="") 
    @name = name 
    @exits = exits 
    @text = text 
    end 
end 

round = GameofRooms.new 
round.get_input_move 

Antwort

0

Du nennst select auf ein Objekt vom Typ Zimmer, kein Array. Es ist nur ein Zimmer, weil diese Linie

@position = @rooms[0]  
0

select ‚s Empfänger @position ist, die eine Instanz von Room ist. Lassen Sie uns in diesem Verfahren einen Blick:

Room.instance_method(:select) 
    #=> #<UnboundMethod: A(Kernel)#select> 
Room.private_instance_methods.include?(:select) 
    #=> true 
Room.public_instance_methods.include?(:select) 
    #=> false 

Das uns das bei Methode teilt ungebunden (und stammt aus dem Modul Kernel, nämlich Kernel#select) und private erhielt letzterer Buchhaltung für die Fehlermeldung.

Kernel#select ist nicht das Verfahren gewünscht. Das liegt daran, dass der Empfänger select falsch ist. Ich erwarte, dass Sie Array#select, die mit @rooms kompatibel sein würde, aber ich weiß nicht, ob der Code sonst korrekt ist.

Verwandte Themen