Forum: Ruby Newbie Mixin Problem

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
jonathan.ruckwood (Guest)
on 2005-11-25 19:48
(Received via mailing list)
Hi, I'm new to Ruby and have done some reading on it. To learn more
about it I'm attempting to re-write some of my Java code. However I
have run into a problem with Modules/Mixins that I can't seem to solve.
My problem is like this; I have a module with the instance method
validIndex? (and some constants) which is included into my other
classes; Board, Strategy and Player.

module Common

  MAX_ENTRIES = 19682

  def validIndex?(index)
    if index >= 0 && index <= MAX_ENTRIES then
      return true
    else
      return false
    end
  end
end

Each Player has two Strategies and Boards represent these. When
creating a Board instance I can use validIndex?, however when creating
a Strategy or Player (which creates new Boards) I get:

NoMethodError: undefined method `validIndex?' for Board:Class
        from /Users/jon_r/Projects/RbNoughtsCrosses/Board.rb:31:in
`numToBoard'
        from /Users/jon_r/Projects/RbNoughtsCrosses/Strategy.rb:13:in
`initialize'
        from /Users/jon_r/Projects/RbNoughtsCrosses/Strategy.rb:12:in
`each'
        from /Users/jon_r/Projects/RbNoughtsCrosses/Strategy.rb:12:in
`initialize'
        from /Users/jon_r/Projects/RbNoughtsCrosses/Player.rb:15:in
`new'
        from /Users/jon_r/Projects/RbNoughtsCrosses/Player.rb:15:in
`initialize'
        from (irb):5:in `new'
        from (irb):5

But when I check each classes instance methods I see validIndex?
listed. I'm confused, as in my eyes, it's similar to the who_am_i?
example given in the book. However there is still a lot for me to
learn. Does anybody recognise this situation, or where I'm going wrong?
I'm sorry if it's stupid but I have tried to find solutions from other
sources. Cheers.

Jonathan
hgs (Guest)
on 2005-11-25 19:56
(Received via mailing list)
On Sat, 26 Nov 2005, jlr8 wrote:

>     if index >= 0 && index <= MAX_ENTRIES then
>
> NoMethodError: undefined method `validIndex?' for Board:Class
This suggests that you are trying to call validate on the
class itself: Board.validIndex() rather than some instance
aboard.validIndex()
>
> But when I check each classes instance methods I see validIndex?

It would help to see the code where it's called, if that isn't the
answer.
        Hugh
caleb (Guest)
on 2005-11-25 20:00
(Received via mailing list)
On Friday 25 November 2005 12:47 pm, jlr8 wrote:

> Each Player has two Strategies and Boards represent these. When
> creating a Board instance I can use validIndex?, however when creating
> a Strategy or Player (which creates new Boards) I get:
>
> NoMethodError: undefined method `validIndex?' for Board:Class

It looks to me like you're calling validIndex? on Board, and not on an
instance of a Board.  Consider this code:

irb(main):001:0> Object.foo
NoMethodError: undefined method `foo' for Object:Class
        from (irb):1

irb(main):002:0> a = Object.new
=> #<Object:0xb7ca26c8>
irb(main):003:0> a.foo
NoMethodError: undefined method `foo' for #<Object:0xb7ca26c8>

See the difference in the errors?

Also, you can simplify your code a little bit:

def validIndex?(index)
  return index.between?(0, MAX_ENTRIES)
end
This topic is locked and can not be replied to.