Seems unlikely, since ‘downcase’ returns a different object; <=> is an
instance method so it needs to operate on ‘self’
Personally I’ve become very sold on ‘has_a’ rather than ‘is_a’
relationships. Taking this approach literally in your case gives:
require ‘delegate’
class Awk < DelegateClass(String)
include Comparable
@@intpattern = /^\s*[-+]?\d+$/
@@casesensitive = false
def self.casesensitive(val)
@@casesensitive = val
end
def initialize(str)
super(str)
end
def <=>(other)
if @@intpattern =~ to_s && @@intpattern =~ other.to_s
to_i <=> other.to_i
elsif @@casesensitive
to_s <=> other.to_s
else
to_s.downcase <=> other.to_s.downcase
end
end
end
However, I can certainly see why you’d want to subclass String in this
example: it just seems the obvious thing to do, and you might be concerned
about the overhead of delegation.
But in general, I find that having an instance variable (it’s “@obj” in the
above example) even for a simple wrapper class that just adds a couple of
methods and delegates everything else can actually be extremely useful. It
allows your wrapper to take on the characteristics of @obj whatever it is,
rather than being restricted to String (say).
A similar result - adding a few methods and leaving everything else
unchanged - can be obtained with singleton classes. How about this approach:
module Awk
@@intpattern = /^\s*[-+]?\d+$/
@@casesensitive = false
def self.casesensitive(val)
@@casesensitive = val
end
def <=>(other)
if @@intpattern =~ to_s && @@intpattern =~ other.to_s
to_i <=> other.to_i
elsif @@casesensitive
to_s <=> other.to_s
else
to_s.downcase <=> other.to_s.downcase
end
end
def ==(other)
(self <=> other) == 0
end
end
a = ‘a’
a.extend Awk
b = ‘A’
b.extend Awk
if a == b
puts ‘equal’
end
a = ‘21’.extend Awk
b = ‘3’.extend Awk
if a > b
puts “OK”
end
That looks pretty neat to me…
Regards,
Brian.
···
On Fri, Mar 28, 2003 at 07:02:09AM +0900, Han Holl wrote:
The problem I’m having is in the case insensitive case: it’s somehow
asymmetrical: while to_i return an integer, to_s does not return a
String but an Awk (as does downcase).
This means I can’t use
downcase <=> other.downcase
as I’s like to. Is it possible to use some variation of super ?