Issue #276 has been reported by Anonymous.

----------------------------------------
Bug #276: take_while functions inconsistently
http://redmine.ruby-lang.org/issues/show/276

Author: Anonymous
Status: Open
Priority: High
Assigned to: 
Category: 
Target version: 


take_while didn't work at all until 1.8.7 - I assume that is how it supposed to be. Perhaps that explains some of this behavior, too?

cards is an Array of Cards

pp cards:
[#<Card:0x179094 @suit="C", @value=4>,
 #<Card:0x1793b4 @suit="C", @value=3>,
 #<Card:0x177dd4 @suit="C", @value=10>,
 #<Card:0x177500 @suit="D", @value=13>,
 #<Card:0x1771e0 @suit="D", @value=14>,
 #<Card:0x1770c8 @suit="S", @value=14>,
 #<Card:0x177794 @suit="C", @value=12>]

suit = 'C'
cards = cards.take_while { |this_card| this_card.suit == suit }:
[#<Card:0x179094 @suit="C", @value=4>,
 #<Card:0x1793b4 @suit="C", @value=3>,
 #<Card:0x177dd4 @suit="C", @value=10>]

Note that #<Card:0x177794 @suit="C", @value=12> is not contained in the take_while although it is also 'C' for the suit.
For some reason, it also does not group the 4th 'C' together when sorted:

  def sortBySuit( cards = nil )
    if ! cards
      cards = @hand_check_cards
    end
    
    cards = cards.sort_by { |card| card.suit }    
  end

self.sortBySuit( cards )

So we try to grab another suit:

suit = 'S'
cards = cards.take_while { |this_card| this_card.suit == suit }:
[]

We end up with nothing.

Here is the Card class.

#!/usr/bin/env ruby

class Card
  
  attr_accessor :value, :suit

  @value
  @suit
  
  def initialize( value, suit )
    if value.is_a?(String)
      @value = value.to_i
    else
      @value = value
      pp value
      pp 'goda'
      exit
    end
    @suit = suit.to_s
  end
  
  def name

    case @value
      when 2 
        name = "2"
      when 3    
        name = "3"      
      when 4    
        name = "4"      
      when 5    
        name = "5"      
      when 6    
        name = "6"      
      when 7    
        name = "7"      
      when 8    
        name = "8"      
      when 9    
        name = "9"      
      when 10   
        name = "10"       
      when "T"    
        name = "10"
      when 11 # Jack
        name = "J"       
      when 12 # Queen
        name = "Q"       
      when 13 # King
        name = "K"       
      when 14 # Ace
        name = "A"      
    end
    return name + @suit
  end
  
  def next
    if @value == 14
      return 2
    else
      return @value + 1
    end
  end
  
  def prev
    if @value == 2
      return 14
    else
      return @value - 1
    end
  end
  
end

and here is where the Cards are initialized with their suits:
  def initCards()
    13.times do |this_time|
      index = this_time + 2
      @cards[index.to_s + 'D'] = Card.new( index.to_s, 'D' )
      @cards[index.to_s + 'C'] = Card.new( index.to_s, 'C' )
      @cards[index.to_s + 'S'] = Card.new( index.to_s, 'S' )
      @cards[index.to_s + 'H'] = Card.new( index.to_s, 'H' )
      @card_index.push( index.to_s + 'C' ) 
      @card_index.push( index.to_s + 'H' ) 
      @card_index.push( index.to_s + 'S' ) 
      @card_index.push( index.to_s + 'D' )
    end
  end

Am I doing something wrong? This seems like a bug. 

Asher (ahaig / penguinmilitia.net)


----------------------------------------
http://redmine.ruby-lang.org