在不使用实例变量ruby的情况下访问方法循环内部的变量

在不使用实例变量ruby的情况下访问方法循环内部的变量,ruby,Ruby,如何访问循环中的player_1_符号(和player_2_符号),而不将其设置为实例方法。我正在尝试循环任何错误的输入,一旦它退出循环,我将调用一个新的\u方法,并需要传递播放器\u 1 \u符号 def select_player_symbol(player_1, player_2) loop do puts "What symbol would you like #{player_1} to be?" player_1_symbol = gets.cho

如何访问循环中的player_1_符号(和player_2_符号),而不将其设置为实例方法。我正在尝试循环任何错误的输入,一旦它退出循环,我将调用一个新的\u方法,并需要传递播放器\u 1 \u符号

  def select_player_symbol(player_1, player_2)
    loop do
      puts "What symbol would you like #{player_1} to be?"
      player_1_symbol = gets.chomp

      puts "What symbol would you like #{player_2} to be?"
      player_2_symbol = gets.chomp

      if player_2_symbol != player_1_symbol
        puts "player 1: #{player_1_symbol}"
        puts "player_2: #{player_2_symbol}"
        break
      end
      puts "Please pick different symbols for each player"
    end
    new_method{player_1,
               player_2,
               player_1_symbol, 
               player_2_symbol}" # How to access these last two variables
  end
这是我之前的代码,但我想重构它。我不确定“更”合适的方式是什么。但是后来我真的很想知道,如果你必须在循环之外调用一个变量,如果不将它设置为实例方法,你会如何做

  def select_player_symbol(player_1, player_2)
    puts "What symbol would you like #{player_1} to be?"
    player_1_symbol = gets.chomp

    puts "What symbol would you like #{player_2} to be?"
    player_2_symbol = gets.chomp

    while player_2_symbol == player_1_symbol
      puts "#{player_1} has already picked that symbol,"
      puts "please pick another symbol."
      player_2_symbol = gets.chomp
    end
    new_method{player_1,
               player_2,
               player_1_symbol, 
               player_2_symbol}
  end

在进入循环之前进行设置,如下所示:

  def select_player_symbol(player_1, player_2)
    player_1_symbol = nil
    player_2_symbol = nil
    loop do
      ...

这是因为在建议的更改中,player_1_符号的作用域是在方法级别。在其作用域位于循环内部之前。当你离开环路时,你失去了它

在方法之外定义它们。 试试看


显然是正确的,但也许OP会从解释为什么这样做中受益。补充评论以澄清
$player_1_symbol = nil
$player_2_symbol = nil


def select_player_symbol(player_1, player_2)
    loop do
      puts "What symbol would you like #{player_1} to be?"
      $player_1_symbol = gets.chomp

      puts "What symbol would you like #{player_2} to be?"
      $player_2_symbol = gets.chomp

      if $player_2_symbol != $player_1_symbol
        puts "player 1: #{$player_1_symbol}"
        puts "player 2: #{$player_2_symbol}"
        break
      end
      puts "Please pick different symbols for each player"
    end
end

def another_method()
   puts "Gloabals are still here #{$player_1_symbol} and #{$player_2_symbol}"

end

#lets try it 
 select_player_symbol("Joe","Adam")
 another_method()