Ruby:在方法中调用'gets'方法保存Nil而不是Input

时间:2015-03-06 20:12:57

标签: ruby-on-rails ruby input terminal gets

好的,这是在终端上运行的Dungeon Text Adventure项目中。

当用户说他想要去北方时#34;它拆分字符串:第一个字检查方法,第二个字检查参数。这种情况发生在其他地方,我复制粘贴了两个方法,它们给我以下问题:

当它呼叫go(北)并且北方没有有效连接时,它显示选项并再次询问用户方向,用户在那一刻输入的输入由于某种原因存储为Nil。

为什么?我也尝试过STDIN.gets.chomp.downcase!并有相同的Nil结果

以下是代码:

    def find_room_in_direction(direction)

##-> if room connects with other on that direction, returns connection

        if find_room_in_dungeon(@player.location).connections.include?(direction.to_sym)
            return find_room_in_dungeon(@player.location).connections[direction.to_sym]

##-> if direction connection is not found, 
##-> show possible connections & return trigger to ask again inside go()

         elsif !find_room_in_dungeon(@player.location).connections.include?(direction.to_sym)
             puts "I don't see any #{direction}..."
             puts "This room only connects #{(find_room_in_dungeon(@player.location)).connections.keys.join(', ')}"
             puts "Where should we go?"

             return :redo
         end
         end


    def go(direction)

        current_direction = @player.location
        new_direction = find_room_in_direction(direction)

##-> if REDO trigger received, ask for new direction & try again

        if new_direction == :redo
            puts "REDOING DIRECTION"

    ##-> HERE IS THE PROBLEM:
    ##-> this does ask for input

            new_direction = gets.chomp.downcase!

##-> but it saves Nil instead of the input, so that puts shows ''

            puts "#{new_direction}"

##-> so this call trows an error: cant call method to Nil

            new_direction = find_room_in_direction(new_direction)

##-> if user entered valid direction from start, the following would run 

        elsif new_direction != :redo && current_direction != new_direction
            @player.location = new_direction
            puts "You go #{direction},"
            puts "and enter #{show_current_description}"
        end
        end

有什么建议吗? 谢谢!

2 个答案:

答案 0 :(得分:5)

您使用downcase!代替downcasedowncase!就地更改字符串,如果没有更改则返回nil(这是发生的事情)。

str = "teSt"
puts str.downcase # test
puts str # teSt
str.downcase! 
puts str # test

请参阅the documentation for downcase!

答案 1 :(得分:0)

刚刚砰的一声。至于downcase有两种变体 - chomp和chomp!