2012-02-20 4 views
1

Я ищу советы по динамическим переменным. В частности, если я наилучшим образом использую 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

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

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) 
+0

спасибо это работает. Таким образом, лучший способ получить это значение - с помощью 'instance_variable_get', есть ли какая-либо вариация на' hit = "@ # {string}" 'вы знаете, что вернет значение, а не строку? Еще раз спасибо. – Alekx

+0

'hit = eval (" @ # {string} ")', но eval - зло. – knut

+0

Ха-ха, еще раз спасибо! – Alekx

Смежные вопросы