2016-10-17 1 views
2

Я совершенно новый для Ruby, и у меня проблемы с выполнением упражнения, которое я пытаюсь решить. Это классическая игра из комнат, и после небольшого беспорядка я придумал код, который выглядел хорошо для меня - минус, что не работает.частный метод `select ', вызываемый для # <Room: 0x00000001f6f5f8> (NoMethodError)

Я пытаюсь вызвать метод select из другого метода в классе, насколько я уверен, что это массив (@position), но я получаю вышеуказанное сообщение об ошибке.

Вот пример моего кода, любая идея о том, почему .select является частным, будет рад!

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 

ответ

0

Вы звоните select на объект типа номер, а не массив. Это только один номер, так как эта линия

@position = @rooms[0]  
0

select «s приемник @position, который является экземпляром Room. Давайте посмотрим на этот метод:

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

Это говорит нам, что в методе является несвязанный (и происходит от модуля Kernel, а именно Kernel#select) и private, на долю которой приходится сообщение об ошибке получил.

Kernel#select - не метод желаемый. Это связано с неправильным приемом приемника select. Я ожидаю, что вы захотите Array#select, который будет совместим с @rooms, но я не знаю, правильно ли код.

Смежные вопросы