【问题标题】:private method `select' called for #<Room:0x00000001f6f5f8> (NoMethodError)#<Room:0x00000001f6f5f8> 调用了私有方法“选择”(NoMethodError)
【发布时间】:2017-02-26 22:58:33
【问题描述】:

我对 Ruby 还是很陌生,但我在完成一个我试图解决的练习时遇到了麻烦。这是一款经典的房间游戏,经过一番混乱后,我想出了一个对我来说看起来不错的代码 - 减去它不起作用。

我正在尝试从类中的另一个方法中调用 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

【问题讨论】:

    标签: ruby select methods


    【解决方案1】:

    您在 Room 类型的对象上调用 select,而不是数组。因为这条线就只有一个房间

    @position = @rooms[0]    
    

    【讨论】:

      【解决方案2】:

      select 的接收者是@position,它是Room 的一个实例。让我们看看那个方法:

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

      这告诉我们 at 方法是未绑定的(并且来自模块Kernel,即Kernel#select)和private,后者解释了收到的错误消息。

      Kernel#select 不是所需的方法。那是因为select 的接收者不正确。我希望您想要Array#select,它将与@rooms 兼容,但我不知道代码是否正确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多