2012-02-20 22 views
1

私は動的変数に関するいくつかのアドバイスを探しています。特に、私がinstance_variable_setを最大限に利用している場合、またはより良い方法がある場合は、私が見ているべきです。アドバイスを事前に感謝します。今すぐコードのために。動的変数の値

私はブラックジャックゲームを作成しています。あなたが見ることができるように、彼らは基本的に同じである

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 

:そして、私はこのように見える2つのvalue_creatorメソッドを持っています。だから私はディーラーとプレーヤーの両方が使うこの方法を作りました。

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 

しかし、私はhit_player"@#{string}"の値を呼び出すしようとすると、それは@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

おかげ

は、最初の2つのアクセサを定義する必要があります。だから、その値を取得する最も良い方法は 'instance_variable_get'であり、' hit = "@#{string}" 'の文字列ではなく値を返すことを知っていますか?再度、感謝します。 – Alekx

+0

'hit = eval(" @#{string} ")' - しかしevalは悪です。 – knut

+0

ハハ、もう一度ありがとう! – Alekx