public static RubyArray /*!*/ ValuesAt(ConversionStorage <int> /*!*/ fixnumCast, RubyStruct /*!*/ self, params object[] /*!*/ values) { RubyArray result = new RubyArray(); object[] data = self.Values; for (int i = 0; i < values.Length; ++i) { Range range = values[i] as Range; if (range != null) { int begin = Protocols.CastToFixnum(fixnumCast, range.Begin); int end = Protocols.CastToFixnum(fixnumCast, range.End); if (range.ExcludeEnd) { end -= 1; } begin = NormalizeIndex(data.Length, begin); end = NormalizeIndex(data.Length, end); Debug.Assert(end - begin <= data.Length); // because we normalized the indicies if (end - begin > 0) { result.AddCapacity(end - begin); for (int j = begin; j <= end; j++) { result.Add(data[j]); } } } else { int index = NormalizeIndex(data.Length, Protocols.CastToFixnum(fixnumCast, values[i])); result.Add(data[index]); } } return(result); }