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"])
我有这个代码,我有几个问题。
首先,为什么我不能2 => 2
或:2 : 2
而不是2 : 2
其次,如果我不能像上面尝试过的那样访问它们,那么属性是什么呢?我是否需要将属性提供给方法然后调用该方法?
答案 0 :(得分:1)
首先,为什么我不能
而不是2 => 2
或:2 : 2
2 : 2
key: value
是:key => value
的快捷方式,即它将key
视为符号。
2: 2
不起作用,因为:2
不是有效的符号。您可以改为使用'2': 2
,但它使用:'2'
(符号)作为键,而不是2
(数字)。
然而,符号在这里没有多大意义,因为你想查找字符串:
card.rank["A"] # <= "A" is not :A
其次,如果我无法像上次尝试那样访问它们,那么属性的重点是什么?
这些不是属性,而是局部变量。属性的工作方式如下:
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
使用常量可能更有意义:
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
并使用特定卡的套装和等级的属性:
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