On Monday, 23 July 2018 at 12:01:19 UTC, Jim Balter wrote:
Do you have an actual case where it was a problem, as opposed
to a contrived example with semantically empty identifiers? I
recently saw another comment objecting to `with` altogether as
being obfuscating because you can't tell which symbols are
qualified by the symbol in the with clause, when the
obfuscation was clearly due to the meaningless names in the
poster's example.
Copy/pasted but changed some bits for clarity.
struct IRCServer
{
// ...
string prefixchars;
string prefixes; // <--
}
struct IRCBot
{
// ...
IRCServer server;
}
struct IRCParser
{
// ...
IRCBot bot;
}
IRCParser parser;
// string content == "EXCEPTS INVEX PREFIX=(Yqaohv)!~&@%+";
foreach (entry; content.splitter(" "))
{
// Roughly rewritten splitting
auto split = entry.findSplit("=");
string key = split[0];
string value = split[2];
with (parser.bot.server)
switch (key)
{
case "PREFIX":
// PREFIX=(Yqaohv)!~&@%+
import std.format : formattedRead;
string modes;
string prefixes; // <--
value.formattedRead("(%s)%s", modes, prefixes);
foreach (immutable i; 0..modes.length)
{
prefixchars[prefixes[i]] = modes[i]; //
parser.bot.server.prefixchars
prefixes ~= modes[i]; // <-- accidental local
prefixes instead of parser.bot.server.prefixes
}
break;
// ...
default:
break;
}
https://github.com/zorael/kameloso/blob/93002da193eac2dfbfeb6c8756feb2d74a345530/source/kameloso/irc.d#L1887