digitalmars.D - multiple-item traversal ranges
- spir (39/39) Mar 30 2011 Hello,
Hello, I take the opportunity of opSlice() now seemingly working (see // thread) to talk about one of the last annoying points for everyday use of ranges for traversal: the absence of "key-ed traversal", or more generally "multi-item traversal", as in: foreach (k,v ; myTable) {...} After some thought on the topic, I would push for a solution where collection types which should provide such multi-item traversal methods, would define a specific struct, eg: struct Map (K,V) { struct Pair { K key ; V value; } struct Range { property Pair front () { assert (! this.empty); Return Pair(...); } ... } Range opSlice () { return Range(this); } ... } The advantages of this solution are: 1. It only uses struct: a builtin, simple & efficient feature. 2. It works *now*, as is; it is just a standard to promote. 3. It trivially allows multiple ranges for the same collection type. 4. It is easy to use & understand on the caller side: foreach (pair ; map) { doSomethingWith(pair.key, pair.value); } foreach (record ; table) { doSomethingWith(record.name, record.phone, record.mail); } Denis -- _________________ vita es estrany spir.wikidot.com
Mar 30 2011