December 27, 2010 [Issue 5379] New: std.array.replace fails on char[]s | ||||
---|---|---|---|---|
| ||||
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 --- Comment #0 from Oliver Goodman <oag@optusnet.com.au> 2010-12-27 00:42:34 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: ------- |
January 03, 2011 [Issue 5379] std.array.replace fails on char[]s | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oliver Goodman | 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 --- Comment #1 from Lars T. Kyllingstad <bugzilla@kyllingen.net> 2011-01-03 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: ------- |
Copyright © 1999-2021 by the D Language Foundation