class methods

C

Clement Ow

I have built my own ruby library where it contains my specific commands
and methods that I need to perform certain actions and my main script.

In my ruby library I have something like:
class Test
def toDDMMYYYY(sep)
strftime("%d#{sep}%m#{sep}%Y")
end
end

And in my main script I have something like:

require 'PersonalRubyLib.rb'

class MainLogic
def show_date
d = Date.today
d.Test.toDDMMYYYY("-")
end
end

But apparently it shows an error:
undefined method `toDDMMYYYY' for #<Date: 4909313
,2299161> (NoMethodError)

Did do wrongly in calling the class methods, maybe I am confused with
the syntax of calling class methods? Much help is appreciated, thanks!
 
R

Robert Dober

I have built my own ruby library where it contains my specific commands
and methods that I need to perform certain actions and my main script.

In my ruby library I have something like:
class Test
def toDDMMYYYY(sep)
strftime("%d#{sep}%m#{sep}%Y")
end
end

And in my main script I have something like:

require 'PersonalRubyLib.rb'

class MainLogic
def show_date
d = Date.today
d.Test.toDDMMYYYY("-")
end
end

But apparently it shows an error:
undefined method `toDDMMYYYY' for #<Date: 4909313
,2299161> (NoMethodError)

Did do wrongly in calling the class methods, maybe I am confused with
the syntax of calling class methods? Much help is appreciated, thanks!

You did not define a class method, actually there are more ways to
implement what you want.
I will show you three here, it is up to you to decide what fits your needs best

class << C = Class::new { ... }
def m; 42 end
end

C.m

class C
def self.m; 42 end
end

C.m

module M
def m; 42 end
module_function :m
end


M.m

HTH
Robert
 
D

Dave Bass

Robert said:
You did not define a class method

To expand, what Robert means is that you defined an instance method. To
make it a class method in class C, you should C.m or self.m, not m
(which would be an instance method).

Personally I prefer self.m, as I can subsequently change the name of the
class if necessary without having to change all the class method names
too. Laziness can be a virtue. ;-)

Dave
 
N

Nando Sanchez

Clement:

I think you have 2 different errors in your script:

1. The error already highlighted by other forum members.
2. You are creating a class named "Test" and a method for it, and later
on you try to call this method inside an object that belongs to a
totally different class (Date class). If you want to add the new method
to the Date class you only need to write:

class Date
def toDDMMYYYY(sep)
strftime("%d#{sep}%m#{sep}%Y")
end
end

In this way the new method will be available in any date object. You
need to modify your main code too:

class MainLogic
def show_date
d = Date.today
d.toDDMMYYYY("-")
end
end

Rgd,

Nando
 
C

Clement Ow

Nando said:
Clement:

I think you have 2 different errors in your script:

1. The error already highlighted by other forum members.
2. You are creating a class named "Test" and a method for it, and later
on you try to call this method inside an object that belongs to a
totally different class (Date class). If you want to add the new method
to the Date class you only need to write:

class Date
def toDDMMYYYY(sep)
strftime("%d#{sep}%m#{sep}%Y")
end
end

In this way the new method will be available in any date object. You
need to modify your main code too:

class MainLogic
def show_date
d = Date.today
d.toDDMMYYYY("-")
end
end

Rgd,

Nando

Thanks for the replies, it makes Ruby learning so much easier! =)

It does work however if i change the class name to Date instead of test
too. But what if my class is an inherited class? Maybe an example might
explain clearer.

Assuming I have 2 classes:

class MadDate < Date
def toDDMMYYYY(sep = "/")
strftime(%d%m%Y")
end
end

class Main
def self.show
d = Date.today
d.toDDMMYYYY("-")
end
end

And when i call, Main.show, it gives the same error "undefined method
toDDMMYYYY". Is there then a way of working around inherited classes?
 
R

ruud grosmann

class MadDate < Date
def toDDMMYYYY(sep = "/")
strftime(%d%m%Y")
end
end

class Main
def self.show
d = Date.today
d.toDDMMYYYY("-")
end
end


hi Nando,
since your extended class is a MadDate, you should create a
MadDate-object, not a Date-object.

Ruud
 

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,774
Messages
2,569,598
Members
45,152
Latest member
LorettaGur
Top