digitalmars.D.learn - How/why can toStringz() and toUTFz() be used as properties?
- Trey Brisbane (21/21) Apr 26 2013 Hey all,
- anonymous (15/36) Apr 26 2013 There's two things at work here:
- Trey Brisbane (2/45) Apr 26 2013 Ahhh ok, thanks for explaining :)
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (6/9) Apr 26 2013 Me neither. I wonder where in the language syntax a "function call" live...
- ollie (6/11) Apr 26 2013 You might want to look at std.windows.charset. You'll find the following...
Hey all, Can someone please explain to me how and why it is that toStringz() and toUTFz() can be used in the following way? string a = "123"; auto b = a.toStringz; auto c = a.toUTFz; Also, how is it that they can even be called as if they were class methods? That is: string a = "123"; auto b = a.toStringz(); // <-- Note I've added parentheses auto c = a.toUTFz(); As opposed to being limited to: string a = "123"; auto b = toStringz(a); auto c = toUTFz(a); I need to understand this, as I wish to write a function toWinStr() that can be used in the same way which will accept any string type, and, based on something like version(Unicode) and const-ness, output a WinAPI LPSTR, LPCSTR, LPWSTR or LPCWSTR as appropriate. Is such a thing possible?
Apr 26 2013
On Friday, 26 April 2013 at 07:31:57 UTC, Trey Brisbane wrote:Hey all, Can someone please explain to me how and why it is that toStringz() and toUTFz() can be used in the following way? string a = "123"; auto b = a.toStringz; auto c = a.toUTFz; Also, how is it that they can even be called as if they were class methods? That is: string a = "123"; auto b = a.toStringz(); // <-- Note I've added parentheses auto c = a.toUTFz(); As opposed to being limited to: string a = "123"; auto b = toStringz(a); auto c = toUTFz(a);There's two things at work here: a) Universal Function Call Syntax (UFCS). That basically means that you can call a free function via method/property-like dot syntax. The first argument to the function goes before the dot. UFCS should be explained in the online language documentation, but if it's in there I can't find it. So, with UFCS you get from toStringz(a) to a.toStringz() . b) Empty parentheses are optional. -- Unless you compile with the -property flag. There has been some discussion about the future of the feature. Optional empty parentheses and/or the -property flag may go away in the future. That gets you from a.toString() to a.toString .I need to understand this, as I wish to write a function toWinStr() that can be used in the same way which will accept any string type, and, based on something like version(Unicode) and const-ness, output a WinAPI LPSTR, LPCSTR, LPWSTR or LPCWSTR as appropriate. Is such a thing possible?You just write your function so that toWinStr(stuff) works. UFCS and optional empty parentheses then enable stuff.toWinStr .
Apr 26 2013
On Friday, 26 April 2013 at 08:49:10 UTC, anonymous wrote:On Friday, 26 April 2013 at 07:31:57 UTC, Trey Brisbane wrote:Ahhh ok, thanks for explaining :)Hey all, Can someone please explain to me how and why it is that toStringz() and toUTFz() can be used in the following way? string a = "123"; auto b = a.toStringz; auto c = a.toUTFz; Also, how is it that they can even be called as if they were class methods? That is: string a = "123"; auto b = a.toStringz(); // <-- Note I've added parentheses auto c = a.toUTFz(); As opposed to being limited to: string a = "123"; auto b = toStringz(a); auto c = toUTFz(a);There's two things at work here: a) Universal Function Call Syntax (UFCS). That basically means that you can call a free function via method/property-like dot syntax. The first argument to the function goes before the dot. UFCS should be explained in the online language documentation, but if it's in there I can't find it. So, with UFCS you get from toStringz(a) to a.toStringz() . b) Empty parentheses are optional. -- Unless you compile with the -property flag. There has been some discussion about the future of the feature. Optional empty parentheses and/or the -property flag may go away in the future. That gets you from a.toString() to a.toString .I need to understand this, as I wish to write a function toWinStr() that can be used in the same way which will accept any string type, and, based on something like version(Unicode) and const-ness, output a WinAPI LPSTR, LPCSTR, LPWSTR or LPCWSTR as appropriate. Is such a thing possible?You just write your function so that toWinStr(stuff) works. UFCS and optional empty parentheses then enable stuff.toWinStr .
Apr 26 2013
On 04/26/2013 01:49 AM, anonymous wrote:On Friday, 26 April 2013 at 07:31:57 UTC, Trey Brisbane wrote:UFCS should be explained in the online language documentation, but if it's in there I can't find it.Me neither. I wonder where in the language syntax a "function call" lives... UFCS does not require more than what you have already said but it looks like I had managed to fill up more space than a couple of paragraphs: :) http://ddili.org/ders/d.en/ufcs.html Ali
Apr 26 2013
On Fri, 26 Apr 2013 09:31:54 +0200, Trey Brisbane wrote:I need to understand this, as I wish to write a function toWinStr() that can be used in the same way which will accept any string type, and, based on something like version(Unicode) and const-ness, output a WinAPI LPSTR, LPCSTR, LPWSTR or LPCWSTR as appropriate. Is such a thing possible?You might want to look at std.windows.charset. You'll find the following functions: const(char)* toMBSz(in char[] s, uint codePage = 0) string fromMBSz(immutable(char)* s, int codePage = 0) These might work for you or you may be able to expand on them.
Apr 26 2013