Truth value evaluating of an object

I know ruby treat an object as false whenever it is nil or false.
However, I wonder if there are any other ways to change this behavior.

For example, I define a class called AreYouOk.
class AreYouOk
      def initialize(ok)
            @ok = ok
      end
end

x = AreYouOk.new(false)
puts "you are ok" if x

Since x is not nil, ruby prints " you are ok".
However, I want ruby to make the decision based on the @ok instance
variable. Are there any ways to do that?

I know that there is a method called __bool__ in Python. You can define
your __bool__ method in your class. The truth value of an object is
based on the return value of __bool__. Does ruby provide similar
mechanism?

···

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

Hi,

I know that there is a method called __bool__ in Python. You can define
your __bool__ method in your class. The truth value of an object is
based on the return value of __bool__. Does ruby provide similar
mechanism?

I don't think I'm speaking out of school when I say that there's no such
way to do so.

Ruby and libraries likely rely on 'if obj' returning false if it's false
or nil - overriding this behaviour will probably cause some strange
behaviour which may result in your object being inadvertently modified!

Instead, just make an accessor like ok?, so you can test "if x.ok?".

If you need some way to test this across several objects, consider this:

class Object
  def ok?
    self
  end
end
class AreYouOk
  def ok?
    @ok
  end
end

Thus 'if x.ok?' returns the same as 'if x' for any object, but @ok for
yours!

Cheers
Arlen

···

On Sat, 2007-10-27 at 23:35 +0900, Dave River wrote:

What you are asking about looks to me like a flag class.

<code>
class Flag
    def initialize(state=false)
       @state = state
    end
    def set?
       @state
    end
    def set
       @state = true
    end
    def clear
       @state = false
    end
end

ok = Flag.new
puts "you are ok" if ok.set?
puts "you are not ok" unless ok.set?
ok.set
puts "you are ok" if ok.set?
puts "you are not ok" unless ok.set?

</code>

First the string "you are not ok" is printed. After the flag is set, the string "you are ok" is printed.

Regards, Morton

···

On Oct 27, 2007, at 10:35 AM, Dave River wrote:

I know ruby treat an object as false whenever it is nil or false.
However, I wonder if there are any other ways to change this behavior.

For example, I define a class called AreYouOk.
class AreYouOk
      def initialize(ok)
            @ok = ok
      end
end

x = AreYouOk.new(false)
puts "you are ok" if x

Since x is not nil, ruby prints " you are ok".
However, I want ruby to make the decision based on the @ok instance
variable. Are there any ways to do that?

I know that there is a method called __bool__ in Python. You can define
your __bool__ method in your class. The truth value of an object is
based on the return value of __bool__. Does ruby provide similar
mechanism?

Thus 'if x.ok?' returns the same as 'if x' for any object, but @ok for
yours!

Thanks for your explanation!

In fact, I am making a wrapper class called Boolean which cooperates
with some legacy code in my company because there are some compatibility
problems between different languages.

I write some code like the following and the Boolean object hides some
underlying code which solve the compatibility problems.
x = Boolean.new()
if x
   do something....
end

If ruby does not support something like __bool__ in Python, I need to
write some code in the following way.
x = Boolean.new()
if x.evaluate()
   do something...
end

But I would prefer "if x " instead of "if x.evaluate" because it is more
straight forward. So, I would like to know whether there are any ways to
do so.

Regards,
Dave

···

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

There are not any ways to do so in Ruby. Sorry. (This question comes
up every few weeks or so.)

···

On Oct 27, 9:18 am, Dave River <carlos_la...@yahoo.com.hk> wrote:

I write some code like the following and the Boolean object hides some
underlying code which solve the compatibility problems.
x = Boolean.new()
if x
   do something....
end

If ruby does not support something like __bool__ in Python, I need to
write some code in the following way.
x = Boolean.new()
if x.evaluate()
   do something...
end

But I would prefer "if x " instead of "if x.evaluate" because it is more
straight forward. So, I would like to know whether there are any ways to
do so.

What exactly does Boolean do? Maybe you can get rid of it or do some other changes so you can directly work with "true" and "false.

Kind regards

  robert

···

On 27.10.2007 17:18, Dave River wrote:

Thus 'if x.ok?' returns the same as 'if x' for any object, but @ok for
yours!

Thanks for your explanation!

In fact, I am making a wrapper class called Boolean which cooperates with some legacy code in my company because there are some compatibility problems between different languages.

I write some code like the following and the Boolean object hides some underlying code which solve the compatibility problems.
x = Boolean.new()
if x
   do something....
end

If ruby does not support something like __bool__ in Python, I need to write some code in the following way.
x = Boolean.new()
if x.evaluate()
   do something...
end

But I would prefer "if x " instead of "if x.evaluate" because it is more straight forward. So, I would like to know whether there are any ways to do so.