Ruby: 'gets' 在方法内部调用的方法保存 Nil 而不是 Input
Ruby: 'gets' method called inside a method saves Nil instead of Input
好的,伙计们,这是在终端上运行的 Dungeon Text Adventure 项目。
当用户说他想要 "go north" 时,它会拆分字符串:第一个字检查方法,第二个字检查参数。这发生在其他地方,我复制粘贴了给我以下问题的 2 种方法:
当它调用 go(north) 而 north 不是有效连接时,它会显示选项并再次询问用户方向,用户此时输入的输入由于某种原因被存储为 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
有什么建议吗?
谢谢!
快吃吧。至于 downcase 有两种变体 - chomp 和 chomp!
您正在使用 downcase!
而不是 downcase
。 downcase!
就地更改字符串,returns 如果没有更改则为零(这就是这里发生的情况)。
str = "teSt"
puts str.downcase # test
puts str # teSt
str.downcase!
puts str # test
好的,伙计们,这是在终端上运行的 Dungeon Text Adventure 项目。
当用户说他想要 "go north" 时,它会拆分字符串:第一个字检查方法,第二个字检查参数。这发生在其他地方,我复制粘贴了给我以下问题的 2 种方法:
当它调用 go(north) 而 north 不是有效连接时,它会显示选项并再次询问用户方向,用户此时输入的输入由于某种原因被存储为 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
有什么建议吗? 谢谢!
快吃吧。至于 downcase 有两种变体 - chomp 和 chomp!
您正在使用 downcase!
而不是 downcase
。 downcase!
就地更改字符串,returns 如果没有更改则为零(这就是这里发生的情况)。
str = "teSt"
puts str.downcase # test
puts str # teSt
str.downcase!
puts str # test