Ruby中的哈希值是否可以实现?

时间:2016-05-20 09:34:42

标签: ruby hash attributes

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 其次,如果我不能像上面尝试过的那样访问它们,那么属性是什么呢?我是否需要将属性提供给方法然后调用该方法?

1 个答案:

答案 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
相关问题