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
Beachten Sie, dass ' {"C": "C"} 'ist äquivalent zu {{C:" C "}'. BTW, was ist der Zweck von "Anzug"? – Stefan
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) . –