How to extend the string class to return this inside the square bracket?
Steven Schveighoffer
schveiguy at gmail.com
Sat Aug 14 00:06:05 UTC 2021
On 8/13/21 7:23 PM, Marcone wrote:
> On Friday, 13 August 2021 at 23:08:07 UTC, jfondren wrote:
>> On Friday, 13 August 2021 at 22:09:59 UTC, Marcone wrote:
>>>
>>> Isn't there some unario operator template that I can use with lambda
>>> to handle a string literal?
>>
>> So, something other than an exact "lit"[0..this.xx(..)] syntax is fine?
>>
>> What didn't you like about `"Hello World!".findSplit("o")[0].writeln;`
>> then?
>>
>> What is a real example of something you want to do?
>
> writeln("Hello World!"[x.indexOf("e")..x.indexOf("r")]);
>
> indexOf()is just a simple example, not the goal. I want handle literal
> inside [] like it bellow, but in literal:
>
> string x = "Hello World!";
> writeln(x[x.indexOf("e")..x.indexOf("r")]);
Operator overloading is only available to custom types (structs or
classes), and not to arrays.
You can create a type to do what you want.
e.g.:
```d
struct SliceByIndexOf
{
string s;
auto opIndex(size_t[2] idxs) {
return SliceByIndexOf(s[ idxs[0] .. idxs[1]]);
}
size_t[2] opSlice(size_t dim : 0)(string s1, string s2) {
import std.string;
return [s.indexOf(s1), s.indexOf(s2)];
}
string toString() { return s; }
}
auto sbio(string s) { return SliceByIndexOf(s); }
void main()
{
import std.stdio;
writeln("Hello World!".sbio["e" .. "r"]); // "ello Wo"
}
```
-Steve
More information about the Digitalmars-d-learn
mailing list