What type does byGrapheme() return?
Steven Schveighoffer
schveiguy at gmail.com
Tue Dec 31 21:36:56 UTC 2019
On 12/31/19 4:22 PM, H. S. Teoh wrote:
> On Tue, Dec 31, 2019 at 04:02:47PM -0500, Steven Schveighoffer via Digitalmars-d-learn wrote:
>> On 12/31/19 2:58 PM, H. S. Teoh wrote:
>>> On Tue, Dec 31, 2019 at 09:33:14AM -0500, Steven Schveighoffer via Digitalmars-d-learn wrote:
>>>> e.g.:
>>>>
>>>> writeln(" Text = ", gr1.map!((ref g) => g[]).joiner.to!string);
>>> [...]
>>>
>>> Unfortunately this doesn't work. Somehow the ref parameter doesn't
>>> match whatever it is std.algorithm.map is trying to pass to it.
>>
>> Huh, it seemed to work for me. Got the full "Robert" with an R. map
>> does support ref-ness. Maybe you didn't put ref in the right place?
>
> Here's my full non-working code:
>
> import std;
> void main() {
> auto x = "Bla\u0301hbla\u0310h\u0309!";
> auto r = x.byGrapheme;
> writefln("%s", r.map!((ref g) => g[]).joiner.to!string);
> }
>
> The compiler says:
>
> /usr/src/d/phobos/std/algorithm/iteration.d(604): Error: template D main.__lambda1 cannot deduce function from argument types !()(Grapheme), candidates are:
> test.d(5): __lambda1
> /usr/src/d/phobos/std/algorithm/iteration.d(499): Error: template instance test.main.MapResult!(__lambda1, Result!string) error instantiating
> test.d(5): instantiated from here: map!(Result!string)
>
> What did I do wrong?
auto r = x.byGrapheme.array;
This is how Robert originally had it if you look a few messages up.
Otherwise, it's not an lvalue.
The fact that a Grapheme's return requires you keep the grapheme in
scope for operations seems completely incorrect and dangerous IMO (note
that operators are going to always have a ref this, even when called on
an rvalue). So even though using ref works, I think the underlying issue
here really is the lifetime problem.
-Steve
More information about the Digitalmars-d-learn
mailing list