Class methods

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!

···

--
Posted via http://www.ruby-forum.com/.

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

···

On Wed, Jul 9, 2008 at 11:22 AM, Clement Ow <clement.ow@asia.bnpparibas.com> wrote:

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!
--
Posted via http://www.ruby-forum.com/\.

--
http://ruby-smalltalk.blogspot.com/

---
AALST (n.) One who changes his name to be further to the front
D.Adams; The Meaning of LIFF

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

···

--
Posted via http://www.ruby-forum.com/.

Robert Dober wrote:

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. :wink:

Dave

···

--
Posted via http://www.ruby-forum.com/\.

Nando Sanchez wrote:

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?

···

--
Posted via http://www.ruby-forum.com/\.

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