Undefined Method confusion - Ruby Newbie (I know it rhymes, don't hurt me)

K

Kaldrenon

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
 
A

Alex LeDonne

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

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
 
D

Daniel Lucraft

Kaldrenon said:
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
 
S

Sebastian Hungerecker

Kaldrenon said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,534
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top