2016-05-20 6 views
-2
class Card 
    suit = {"C":"C", "D":"D", "H":"H", "S":"S"} 
    rank = { :A => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, :J => 11, :Q => 12, :K => 13} 
end 

card = Card.new 

puts(card.rank["A"]) 

Ich habe diesen Code und ich habe ein paar Fragen.Ist das mit Hashes in Ruby möglich?

Erstens statt 2 => 2 zu tun, warum kann ich tun, nur :2 : 2 oder 2 : 2 Zweitens, was ist der Punkt, der Attribute, wenn ich auf sie zugreifen kann nicht, wie ich oben versucht haben? Muss ich das Attribut in eine Methode einspeisen und diese Methode aufrufen?

+0

Beachten Sie, dass ' {"C": "C"} 'ist äquivalent zu {{C:" C "}'. BTW, was ist der Zweck von "Anzug"? – Stefan

+1

Wenn Sie zwei Fragen haben, sollten Sie zwei Fragen stellen. Eigentlich solltest du aber keine Fragen posten, da deine Fragen schon mehrfach gestellt und beantwortet wurden. Die kurze Zusammenfassung ist: 1) Weil die Syntax es nicht erlaubt. 2) Weil Ihr 'Rang'-Hash keinen" A "-Schlüssel hat, hat er nur einen': A'-Schlüssel, was etwas völlig anderes ist. Auch "suit" und "rank" sind lokale Variablen im Klassenkörper, auf die man von außen nicht zugreifen kann (dies ist ein drittes Problem, über das man eigentlich gar nicht nachfragte; das wurde auch schon mehrfach gefragt und beantwortet) . –

Antwort

1

Erstens statt 2 => 2 tun, warum kann ich tun, nur :2 : 2 oder 2 : 2

key: value ist eine Abkürzung für :key => value, das heißt es key als Symbol behandelt.

2: 2 funktioniert nicht, weil :2 kein gültiges Symbol ist. Sie könnten stattdessen '2': 2 verwenden, aber es verwendet :'2' (ein Symbol) als Schlüssel, nicht 2 (eine Zahl).

jedoch keine Symbole viel Sinn hier machen, weil Sie bis Strings aussehen wollen:

card.rank["A"] # <= "A" is not :A 

Zweitens: Was ist der Punkt der Attribute, wenn ich kann nicht auf sie zugreifen, wie ich versucht haben, über?

Dies sind keine Attribute, sondern lokale Variablen. Attribute funktionieren wie folgt aus:

class Card 
    attr_reader :suit, :rank 

    def initialize 
    @suit = { 'C' => 'C', 'D' => 'D', 'H' => 'H', 'S' => 'S' } 
    @rank = { 'A' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '10' => 10, 'J' => 11, 'Q' => 12, 'K' => 13 } 
    end 
end 

card = Card.new 

card.rank  #=> {"A"=>1, "2"=>2, "3"=>3, "4"=>4, "5"=>5, "6"=>6, "7"=>7, "8"=>8, "9"=>9, "10"=>10, "J"=>11, "Q"=>12, "K"=>13} 
card.rank['A'] #=> 1 

Es macht wahrscheinlich mehr Sinn Konstanten zu verwenden:

class Card 
    SUITS = { 'C' => 'C', 'D' => 'D', 'H' => 'H', 'S' => 'S' } 
    RANKS = { 'A' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '10' => 10, 'J' => 11, 'Q' => 12, 'K' => 13 } 
end 

Card::RANKS['A'] #=> 1 

Und Verwendung Attribute für den Anzug und Rang einer bestimmten Karte:

class Card 
    SUITS = { 'C' => 'C', 'D' => 'D', 'H' => 'H', 'S' => 'S' } 
    RANKS = { 'A' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '10' => 10, 'J' => 11, 'Q' => 12, 'K' => 13 } 

    attr_reader :suit, :rank 

    def initialize(suit, rank) 
    @suit = suit 
    @rank = rank 
    end 

    def value 
    RANKS[rank] 
    end 
end 

card = Card.new('C', 'A') 

card.suit #=> "C" 
card.rank #=> "A" 
card.value #=> 1 
+0

das scheint zu funktionieren. nur Problem, wenn ich es laufe ist, dass nichts passiert? – hellogoodbye

+0

Es ist üblich, die Ergebnisse eines Ausdrucks als Kommentar in dieselbe Zeile (oder die nächste Zeile) zu schreiben. Dies ähnelt der Funktionsweise von IRB. Wenn Sie eine tatsächliche Ausgabe erzeugen möchten, müssen Sie 'puts', z. 'puts card.suit' – Stefan

+1

natürlich. Ich werde das auf Freitagmorgen-Syndrom reduzieren. Prost! – hellogoodbye