2012-02-20 203 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 2012-02-20 23:29:47

+0

'hit = eval(「@#{string}」)' - 但eval是邪惡的。 – knut 2012-02-20 23:31:26

+0

哈哈,再次感謝! – Alekx 2012-02-20 23:39:47