Farrel Lifson
3/28/2005 7:02:00 PM
Yeah I think this is my best bet at the moment. Florian's suggestion
is a little bit too much effort to implement at the moment for a small
change like this.
Farrel
On Tue, 29 Mar 2005 03:34:46 +0900, Phil Tomson <ptkwt@aracnet.com> wrote:
> In article <c2c0b66050328082336b5a5e6@mail.gmail.com>,
> Farrel Lifson <farrel.lifson@gmail.com> wrote:
> >Hi Rubyists,
> >
> >Is it possible to somehow ducktype an object so that it behaves like a
> >boolean object (ie true or false)?
> >
> >The problem I'm having at the moment is that I'd like to have a
> >modified boolean value so that instead of returning "true" or "false",
> >my objects to_s returns "1" when true and "0" when false. I've tried
> >the following
> >
> >@myTrue = true
> >def @myTrue.to_s
> > return "1"
> >end
> >
> >however creating an anonymous class doesn't seem to be allowed and
> >this affected the results of the original true instance (it now
> >returns "1" as well) which I'd prefer stayed untouched.
> >
> >I thought of using numbers such as 1 for true but 0 is not false in a
> >boolean expression.
> >
> >So is there a way to create an object that acts like a true or false
> >when in boolean expression but still be modified without changing the
> >true or false global objects? Or is there any function called in the
> >evaluation of boolean expresssions which would allow me to ducktype a
> >modified object?
> >
>
> You say you want to have it return a string "1", but what if you return
> an Integer 1 instead? TrueClass doesn't have a to_i method defined in
> it, so you could do:
>
> class TrueClass
> def to_i
> return 1
> end
> end
>
> Alternatively, TrueClass doesn't have a to_str method defined either, so
> if you _really_ need a string you could define:
>
> class TrueClass
> def to_str
> return "1"
> end
> end
>
> ....but of course, if you're looking to use this in places where to_s is
> automatically called (like in puts) then it won't work right.
>
> The problem is that 'true' and 'false' are treated as boolean literals,
> so whenever you use them you get a TrueClass or FalseClass. I think that
> means that you can't just have a MyTrueClass that inherits from TrueClass
> and have it work right - it won't. That means you have to define new
> methods on TrueClass/FalseClass.
>
> I think your best bet is to define the to_i method on TrueClass (as
> above) because that's really what you're trying to get, an integer. Then
> if you need a string you can convert the resulting integer to a string
> explicitly.
>
>
> Phil
>
>