Forum: Ruby Undefined Method confusion - Ruby Newbie (I know it rhymes,

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.
Kaldrenon (Guest)
on 2007-07-17 23:27
(Received via mailing list)
Hi all.

I recently got into challenging myself with some of the tasks over at
Project Euler (www.projecteuler.net), and while working on the
solution for one of them (# 14) I came across a Ruby problem. Now, I'm
pretty sure that this is just a dumbness on my part, but I don't know
how to fix this problem because I see no differences between my code
and the examples at http://www.whytheluckystiff.net/ruby/pickaxe/ for
declaring and calling methods.

Here's the code (it's tiny so I'll copy the whole thing):

class Test
  def series(n,x)
    if (n == 1)
      return x
    elsif (n % 2 == 0 )
      return sequence(n/2, x + 1)
    else
      return sequence(3*n + 1, x + 1)
    end
  end

  max_num = 1
  max_len = 1
  for i in 2...1_000_000 do
    my_len = series(i,1)
    if (my_len > max_len)
      max_len = my_len
      max_num = i
    end
  end
  print max_num , ": chain of length  " , max_len
end

The error I'm getting is this:
undefined method `series' for Test:Class (NoMethodError)
  from euler14.rb:14:in `each'

I see no clear reason why I'm getting this error. Can you un-dumb me?

Thanks in advance,
Andrew
Daniel L. (Guest)
on 2007-07-17 23:41
Kaldrenon wrote:
> Hi all.
>
> I recently got into challenging myself with some of the tasks over at
> Project Euler (www.projecteuler.net), and while working on the
> solution for one of them (# 14) I came across a Ruby problem. Now, I'm
> pretty sure that this is just a dumbness on my part, but I don't know
> how to fix this problem because I see no differences between my code
> and the examples at http://www.whytheluckystiff.net/ruby/pickaxe/ for
> declaring and calling methods.
>
> Here's the code (it's tiny so I'll copy the whole thing):
>
> class Test
>   def series(n,x)
>     if (n == 1)
>       return x
>     elsif (n % 2 == 0 )
>       return sequence(n/2, x + 1)
>     else
>       return sequence(3*n + 1, x + 1)
>     end
>   end
>
>   max_num = 1
>   max_len = 1
>   for i in 2...1_000_000 do
>     my_len = series(i,1)
>     if (my_len > max_len)
>       max_len = my_len
>       max_num = i
>     end
>   end
>   print max_num , ": chain of length  " , max_len
> end
>
> The error I'm getting is this:
> undefined method `series' for Test:Class (NoMethodError)
>   from euler14.rb:14:in `each'
>
> I see no clear reason why I'm getting this error. Can you un-dumb me?
>
> Thanks in advance,
> Andrew

I enjoy Project Euler too. The error you are getting here is because the
method 'series' is an instance method, i.e.:
> a = Test.new
> a.series      #=> calls method

> Test.series   #=> gives missing method error

The 'for' loop is executing in the context of the class definition, so
it is looking for a class method. The error message indicates that it is
looking for the method on Test:Class.

You can either turn 'series' into a class method:

class Test
  def self.series
  ...

or you can move the for loop out of the class and create a test object:

class Test
  def series
     ...
  end
end

t = Test.new
max_num = 1
max_len = 1
for i in 2...1_000_000 do
  my_len = t.series(i, 1)
  ...

Incidentally, in the code you gave there's no method called 'sequence'.
Is it possible you meant 'series' there too?

best,
Dan
Alex LeDonne (Guest)
on 2007-07-17 23:42
(Received via mailing list)
On 7/17/07, Kaldrenon <removed_email_address@domain.invalid> wrote:
> Here's the code (it's tiny so I'll copy the whole thing):
>   end
>   print max_num , ": chain of length  " , max_len
> end
>
> The error I'm getting is this:
> undefined method `series' for Test:Class (NoMethodError)
>         from euler14.rb:14:in `each'
>
> I see no clear reason why I'm getting this error. Can you un-dumb me?
>
> Thanks in advance,
> Andrew

Andrew,

You've created an instance method, but you're calling a class method.

Try defining a class method with:

def self.series(n,x)

instead.

Also, did you notice that you're returning sequence(), rather than
series()? :)

-Alex
Sebastian H. (Guest)
on 2007-07-17 23:46
(Received via mailing list)
Kaldrenon wrote:
> The error I'm getting is this:
> undefined method `series' for Test:Class (NoMethodError)
>   from euler14.rb:14:in `each'
>
> I see no clear reason why I'm getting this error. Can you un-dumb me?

You define series as an instance method, but you try to invoke it as a
class
method. If you do

class Bla
  def blubb() end
end
x=Bla.new

there will be a x.blubb but no Bla.blubb.
If you want a Bla.blubb you have to define it with "def self.blubb".
Also given the fact that you never create an instance of your class, you
don't
actually need to define a class.
This topic is locked and can not be replied to.