значения динамических переменных - PullRequest
1 голос
/ 21 февраля 2012

Я ищу несколько советов по динамическим переменным.Особенно, если я лучше использую instance_variable_set или если есть лучший способ, на который я должен смотреть.Спасибо заранее за любые советы.Теперь код.

Я создаю игру в блэкджек.И у меня есть два value_creator метода, которые выглядят так:

class Blackjack

  def dealers_card_value_creator
    @card_value = @hit_dealer
      case
      when @card_value.match(/\d+/)
        @card_value = @card_value.match(/\d+/)[0].to_i
      when @card_value.match(/Ace/)
        if @dealers_hand >= 11
          @card_value = 1
        else
          @card_value = 11
        end
      when @card_value.match(/Jack|Queen|King/)
        @card_value = 10
      else
        puts "there was an error. please try again."
      end
    @hit_dealer = @card_value
    @dealers_hand = @dealers_hand + @hit_dealer
      if @dealers_hand > 21 then puts "Dealer went over 21. You won $#{@bet}. Nice!" 
        deal end
  end

def players_card_value_creator
    @card_value = @hit_player
    case
    when @card_value.match(/\d+/)
      @card_value = @card_value.match(/\d+/)[0].to_i
    when @card_value.match(/Ace/)
      if @players_hand >= 11
        @card_value = 1
      else
        @card_value = 11
      end
    when @card_value.match(/Jack|Queen|King/)
      @card_value = 10
    else
      puts "there was an error. please try again."
    end
    @hit_player = @card_value
    @players_hand = @players_hand + @hit_player
      if @players_hand > 21 then puts "You went over 21. You lost $#{@bet}. Try again." 
        deal end
  end
end

, как вы можете видеть, они в основном одинаковы.Поэтому я создал этот метод для использования как дилерами, так и игроками.

def value_creator(string)
    hit = "@#{string}" #returns either @player or @dealer
    instance_variable_set(hit, "#{@hit_card}")
    @card_value = hit
    case
    when @card_value.match(/\d+/)
      @card_value = @card_value.match(/\d+/)[0].to_i
    when @card_value.match(/Ace/)
      if "@#{string}"_hand >= 11
        @card_value = 1
      else
        @card_value = 11
      end
    when @card_value.match(/Jack/)
      @card_value = 10
    when @card_value.match(/Queen/)
      @card_value = 10
    when @card_value.match(/King/)
      @card_value = 10
    else
      puts "there was an error. please try again."
    end
    "@#{string}" = @card_value
    "@#{string}"_hand = "@#{string}"_hand + "@#{string}"
  end

  def hit_dealer
    @hit_card = @shuffled_deck.pop
    value_creator("dealer")
  end

  def hit_player
    @hit_card = @shuffled_deck.pop
    value_creator("player")
  end

Но когда я пытаюсь вызвать значение "@#{string}" с hit_player, возвращается @player, а не значениеназначено.

Много кода, но я надеюсь, что это поможет лучше понять, что я пытаюсь сделать, и поможет лучше посоветовать.Еще раз спасибо заранее.

1 Ответ

1 голос
/ 21 февраля 2012

Комментарий в

hit = "@#{string}" #returns either @player or @dealer

неверен.Результат не @player или @dealer, это строка '@player' или '@dealer'.

. Вы можете сделать что-то вроде:

def value_creator( variant )
  case variant 
    when :player
      hit = @player
    when :dealer
      hit = @dealer
    else
      raise ArgumentError
    end
    #....
end
def hit_dealer
  @hit_card = @shuffled_deck.pop
  value_creator(:dealer)
end

def hit_player
  @hit_card = @shuffled_deck.pop
  value_creator(:player)
end

Альтернатива: Использовать instance_variable_get чтобы получить значение.

  hit = instance_variable_get("@#{string}")

Две другие возможности:

  hit = eval("@#{string}")

(мне не нравится - eval - зло).

И с send.

Сначала необходимо определить два метода доступа:

attr_reader :player
attr_reader :dealer

Затем вы можете использовать:

def value_creator( string )
  hit = send( string )
...