digitalmars.D.bugs - [Issue 5379] New: std.array.replace fails on char[]s
- d-bugmail puremagic.com (34/34) Dec 27 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5379
- d-bugmail puremagic.com (29/29) Jan 03 2011 http://d.puremagic.com/issues/show_bug.cgi?id=5379
http://d.puremagic.com/issues/show_bug.cgi?id=5379 Summary: std.array.replace fails on char[]s Product: D Version: D2 Platform: x86 OS/Version: Mac OS X Status: NEW Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: oag optusnet.com.au PST --- import std.stdio; import std.array; void main() { char[] s = "abcdef".dup; char[] t = "xxxx".dup; replace(s, 2, 4, t); writefln("s = %s", s); } /+ Gives me the following compile error: mymble:d oag$ dmd replace.d replace.d(7): Error: template std.array.replace(T,Range) if (is(ElementType!(Range) == T)) does not match any function template declaration replace.d(7): Error: template std.array.replace(T,Range) if (is(ElementType!(Range) == T)) cannot deduce template function from argument types !()(char[],int,int,char[]) It appears to think that ElementType!(char[]) is dchar. +/ -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 27 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5379 Lars T. Kyllingstad <bugzilla kyllingen.net> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |bugzilla kyllingen.net Resolution| |WONTFIX 05:55:54 PST --- The thing is, char[] is assumed to be UTF-8 encoded, which means that one array element doesn't necessarily correspond to one symbol (or, more precisely, one code point may be composed of several code units). That's why (from a range point of view) the element type of char[] is dchar, which is UTF-32 encoded, or "decoded" in the sense that one element is one symbol. Here's an example to prove the point: char[] foo = "�ngstr�m"; replace(foo, 0, 1, "a"); If this were allowed, foo would not contain "angstr�m" as one may expect, it would contain garbage. This is because the first character, "�", spans two array elements. You have two options: 1. If you want to use std.array.replace() like this with character arrays, you should use dchar[]. 2. Use std.string.replace(), which works with strings but always allocates. I am closing this as WONTFIX. There are several people who disagree with dchar being the range element type of char[], however, so feel free to reopen as an enhancement request if you wish. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jan 03 2011