On 6/10/07, Robert Klemme <shortcutter / googlemail.com> wrote: > > A funny (and readable) way to test collection sizes just occurred to me: > > irb(main):001:0> class Integer > irb(main):002:1> def elements > irb(main):003:2> cond = lambda {|enum| self == enum.size} > irb(main):004:2> class <<cond > irb(main):005:3> alias :=== :call > irb(main):006:3> end > irb(main):007:2> cond > irb(main):008:2> end > irb(main):009:1> end > => nil > irb(main):010:0> case [1,2,3] > irb(main):011:1> when 3.elements > irb(main):012:1> puts "three!" > irb(main):013:1> when 5.elements > irb(main):014:1> puts "too much!" > irb(main):015:1> else > irb(main):016:1* puts "else" > irb(main):017:1> end > three! > => nil > > :-) > > Kind regards > > robert > > As I said, this is really cool, now here comes a first quick hack of generalization, you gotta file an RCR for this ;) Please note the absence of "@" in my code ;) class Module def define_casey args={} arg_mth = args[:on] name = args[:name] trans = args[:transform] define_method name do cond = lambda{ |x| trans ? self.send(trans) == x.send( arg_mth ) : self == x.send( arg_mth ) } class << cond alias_method :===, :call end cond end end end class Integer define_casey :on => :size, :name => :elements end case [] when 0.elements puts :empty end What you think? Cheers Robert -- You see things; and you say Why? But I dream things that never were; and I say Why not? -- George Bernard Shaw