2016-10-17 11 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の受信機がRoomのインスタンスである、@positionあるので、それはただ一つの部屋です。のは、その方法を見てみましょう:

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

これはメソッドでバインドされていない(とモジュールすなわちKernel#selectKernel、から来ている)とprivate、受信したエラーメッセージのための後者の会計処理を教えてくれる。

Kernel#selectは、望ましい方法ではありません。これは、selectの受信者が間違っているためです。私はあなたがを希望し、@roomsと互換性があると期待していますが、そうでなければコードが正しいかどうかわかりません。

関連する問題