Help with error - undefined class method

WARNING: Ruby n00b question!

I’m trying to solve the below problem for a class I’m taking, but keep getting the following errors. Can someone tell me what I’m doing wrong?

Implement a new Die class which takes an array of strings as its input. When Die#roll is called, it randomly returns one of these strings. If Die.new is passed an empty array, raise an ArgumentError. It should work like this:

die = Die.new(['A', 'B', 'C', 'D', 'E', 'F'])
die.sides # still returns the number of sides, in this case 6
die.roll # returns one of ['A', 'B', 'C', 'D', 'E', 'F'], randomly

My code:


class Die
  def initialize(labels)
    if labels.empty?
      raise ArgumentError.new("Your die must have 1 or more sides!")
    else
      @sides = labels.length
   end
end

def sides
  @sides
end

def roll
  (1..@sides).each do |x|
  return #What goes here? Need strings in the array to correspond to variable @sides...
  end
end

end

Errors I’m getting:
[COLOR=“#FF0000”]
Error!
Die#roll returns a single letter if one label is passed in
expected: [“J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”, “J”] got: [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] (compared using ==) Diff: @@ -1,101 +1,101 @@ -[“J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”, - “J”] +[nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil]

Error!
Die#roll returns every possible letter for a sufficiently large number of rolls
expected: [“C”, “E”, “G”, “H”, “K”, “M”, “N”, “O”, “P”, “Q”, “R”, “T”, “V”, “W”, “Z”] got: [nil] (compared using ==) Diff: @@ -1,2 +1,2 @@ -[“C”, “E”, “G”, “H”, “K”, “M”, “N”, “O”, “P”, “Q”, “R”, “T”, “V”, “W”, “Z”] +[nil]
[/COLOR]

Anybody know what I’m doing wrong? Would really appreciate some help from an expert.

Hi,

You can do it like this:

class Die
  def initialize(labels)
    if labels.empty?
      raise ArgumentError.new("Your die must have 1 or more sides!")
    else
      @labels = labels
    end
  end

  def sides
    @labels.length
  end

  def roll
    @labels.sample
  end
end

die = Die.new(['A', 'B', 'C', 'D', 'E', 'F'])
p die.sides 
p die.roll

To return a random element from an array, you can use Array#sample

HTH

THANK YOU, PULLO!

Hi Pullo,

I have another question about a different problem. Do you mind if I direct message you?

  • Eufonik

Hi there,

I would prefer it if you started a new thread in the (Ruby) forum.
That way, not only might your question benefit someone else in the future, but it will also be seen by more rubyists who may contribute to the answer.