From: MonkeeSage Date: 2006-10-04T23:50:18+09:00 Subject: Re: Equvialent of Python slices? Hi Peter, In ruby you can extend built-in objects, so you can get the same (general) functionality by adding a method to Enumerable (which is mixed-in to String and Array [and Hash, too, but step is not meaningful for that class]): module Enumerable def step(*args) start, stop = 0, -1 case args.size when 1 step = args[0] when 2 start = args[0] step = args[1] when 3 start = args[0] stop = args[1] step = args[2] else raise(ArgumentError, "`step': wrong number of " + "arguments (#{args.size} for 3)", caller) end if self.is_a?(Hash) raise(NoMethodError, "`step': not implemented for Hash", caller) end seq = self[start..stop] pos = 0 if self.is_a?(Array) out = seq[0,1] elsif self.is_a?(String) out = seq[0,1].to_s end while pos < seq.size val = seq[(pos += step)] out << val unless val.nil? end out end end # start at index 2 and step by 2... p "abcdefg".step(2, 2) # => "ceg" p %w{a b c d e f g}.step(2, 2) # => ["c", "e", "g"] # this breaks {'a'=>'b'}.step(2) # => -:60: `step': not implemented for Hash (NoMethodError) Regards, Jordan