我正在写一个卡片组生成器,这是我想出的解决方案,但我发现它跨越了多行并且看起来不太好,还有其他方法可以构建这张卡片吗?
deck = []
'23456789TJQKA'.each_char do |rank|
'SHDC'.each_char do |suit|
deck << rank + suit
end
end
我正在写一个卡片组生成器,这是我想出的解决方案,但我发现它跨越了多行并且看起来不太好,还有其他方法可以构建这张卡片吗?
deck = []
'23456789TJQKA'.each_char do |rank|
'SHDC'.each_char do |suit|
deck << rank + suit
end
end
您可以使用Array#product
从两个数组生成笛卡尔积。
# ruby 2.0
deck = '23456789TJQKA'.chars.product('SHDC'.chars).map{|a| a.join}
# ruby 1.9
deck = '23456789TJQKA'.split(//).product('SHDC'.split(//)).map{|a| a.join}
正如DNNX评论的那样,您可以使用.map(&:join)
来获得更短的。
但是,我认为编写清晰的程序比编写紧凑的程序要好。
作为使用块变体的示例product(other_ary, ...) { |p| block }
deck = []
'23456789TJQKA'.split('').product('SHDC'.split('')){|el| deck << el.join}
正如 Arie 建议的那样,编写一个清晰的程序比编写一个更短的程序要好。我认为这个很简单:
deck = %w(2S 2H 2D 2C
3S 3H 3D 3C
4S 4H 4D 4C
5S 5H 5D 5C
6S 6H 6D 6C
7S 7H 7D 7C
8S 8H 8D 8C
9S 9H 9D 9C
TS TH TD TC
JS JH JD JC
QS QH QD QC
KS KH KD KC
AS AH AD AC)
只是在开玩笑。