Report abuse

NOTES


			
A trial to ensure constraints in Ruby method interface...
See http://sobe-session.blogspot.com/2008/06/ruby-duck-safe-interface.html
And Qwak qwak !
_Sobe_TcheBTchev_

Safety.rb


			
module Safety

    # Negator for error message
    @@neg_converter = {:is_a?       => "is not a",
                       :respond_to? => "does not respond to",
                       :include?    => "does not include",
                       :each_element_is_a? => "contains element(s) that is(are) not"}

    # Ensure that constraints are respected
    def ensure_it cstr
        cstr.each do |arg, cstrs|
            value = cstrs[0] 
            cstrs[1...cstrs.size].each do |pair| 
                if not value.method(pair[0]).call(pair[1]) then
                    raise "Argument #{arg} (#{value.inspect}) \
                          #{@@neg_converter[pair[0].to_sym]} #{pair[1]}."
                end
            end
        end
    end

    private

    # A simple example of constraint method
    def each_element_is_a? klass
        assertion = true
        self.each do |elt|
            assertion = false if not elt.is_a? klass
        end
        assertion
    end

end

Example1.rb


			
require 'Safety'

class Fixnum
    include Safety
    def mult_by_plus num1, num2
        ensure_it({:num1 => [num1, [:is_a?, Fixnum]],
                   :num2 => [num2, [:respond_to?, :next]]})
        self*num1+num2
    end
end

a = 1
puts a.mult_by_plus(1,2)
puts a.mult_by_plus(1,1)
puts a.mult_by_plus(1,1.0) #=> Error raised

Example2.rb


			
require 'Safety'

include Safety

def potamok tab
    ensure_it({:tab => [tab, [:respond_to?, :each],
                             [:each_element_is_a?, Fixnum]]})
    val = 0                         
    tab.each do |elt|
        val += elt**2
    end
    val
end

puts potamok [42,33,59]
puts potamok [1,2,3,6,59.3] #=> Error raised