【问题标题】:Is there a smarter solution for querying data from user是否有更智能的解决方案来查询用户数据
【发布时间】:2021-04-25 13:49:26
【问题描述】:

我想从用户那里查询一个玩家名字,如果超过了尝试次数 ==> 中止。 我提出了这个解决方案,但我认为还有另一种更简单/更智能的方法:

def queryplayername(displaymessage)
  puts displaymessage
  return gets.chomp.strip
end

def exitforspecificreason(reason)
  puts "Exiting the game for #{reason}"
  exit
end
    
player1name = queryplayername("Enter Player 1's name:")
timesleft = 3
while player1name.empty?
  player1name = queryplayername("Player name can not be empty, please enter valid Player1 name, #{timesleft} times left:")
  timesleft -= 1
  exitforspecificreason('Exiting the game : exceeded number of tries!') if timesleft.zero? && player1name.empty?
end

是否有更好的解决方案来使用 (times/upto/until) 替换 while 循环?

感谢任何输入。

干杯!

【问题讨论】:

  • 请注意,Ruby 的宗旨是简短、简洁但富有表现力。让方法名称如此复杂且冗长确实违背了规定。通常你会将它们包装在一个类中,这样你就可以执行game.prompt_player_namegame.exit 之类的操作。

标签: ruby methods while-loop


【解决方案1】:

有很多方法可以做到这一点,但我认为你应该从这里开始:

class Player
  attr_accessor :name

  def initialize
    get_name
  end 

  def prompt
    print 'Enter player name: '
    @name = gets.chomp
    STDERR.puts "Name can't be empty." if @name.empty?
  end 

  def get_name
    max_tries = 3 
    1.upto(max_tries) do
      prompt
      return if !@name.empty?
    end 
    raise "exceeded #{max_tries} tries"
  end 
end

class Game
  def initialize
    @player1 = Player.new
  end 
end

game = Game.new

这将提示最多 3 次,如果超过尝试次数,则会引发异常:

`get_name':超过 3 次尝试 (RuntimeError)

如果你真的想依靠标准输出而不是异常来退出游戏,只需将raise 的调用替换为将退出程序的任何方法(提示:不要调用它#exit,因为这会冲突Kernel#exit)。

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多