Christian Neukirchen wrote: > *hears 1000 functional programmers whine about return values getting > lost* Just so all those functional programmers don't lose their return values: --------------------------------------------------------------- class Object def true? TrueValue.new(yield) end def false? TrueValue.new(nil) end end class FalseClass def true? FalseValue.new(nil) end def false? FalseValue.new(yield) end end class NilClass def true? FalseValue.new(nil) end def false? FalseValue.new(yield) end end class BooleanValue attr_reader :value def initialize(val) @value = val end def true? self end def false? self end end class TrueValue < BooleanValue def true? TrueValue.new(yield) end end class FalseValue < BooleanValue def false? FalseValue.new(yield) end end require 'test/unit' class TestTrueFalse < Test::Unit::TestCase def test_false_results assert_equal nil, false.true? { no }.value assert_equal yes, false.true? { no }.false? { yes }.value assert_equal yes, false.false? { yes }.value assert_equal yes, false.false? { yes }.true? { no }.value end def test_nil_results assert_equal nil, nil.true? { no }.value assert_equal yes, nil.true? { no }.false? { yes }.value assert_equal yes, nil.false? { yes }.value assert_equal yes, nil.false? { yes }.true? { no }.value end def test_true_results assert_equal yes, true.true? { yes }.value assert_equal yes, true.true? { yes }.false? { no }.value assert_equal nil, true.false? { no }.value assert_equal yes, true.false? { no }.true? { yes }.value end def test_object_results assert_equal yes, "hi".true? { yes }.value assert_equal yes, "hi".true? { yes }.false? { no }.value assert_equal nil, "hi".false? { no }.value assert_equal yes, "hi".false? { no }.true? { yes }.value end def test_true_true_chains check_chain(true, :true?) check_chain("hi", :true?) assert_equal nil, nil.true? { no }.true? { no }.value assert_equal nil, false.true? { no }.true? { no }.value end def test_false_false_chains assert_equal nil, "hi".false? { no }.false? { no }.value assert_equal nil, true.false? { no }.false? { no }.value check_chain(nil, :false?) check_chain(false, :false?) end def check_chain(value, method) i = 0 assert_equal 3, value. send(method) { i += 1 }. send(method) { i += 2 }.value assert_equal 3, i end def yes :yes end def no fail "Should never execute this" end end -- -- Jim Weirich -- Posted via http://www.ruby-forum.com/.