最近我对D编程语言感兴趣.我刚刚开始学习它,并且来自C++背景.我想知道是否有相当于std :: remove_if.我只看到删除浏览dlang网站上的文档.
如果没有直接的等价物,那么在D中获得相同结果的正确或最恰当的方法是什么?
编辑:我应该补充一点,我在擦除 - 删除的上下文中思考
如果我导入std.c库而不是在C中包含库,C代码是否会使用D编译器进行编译,还是存在其他后缀兼容性问题?
每当我尝试在D中使用范围时,我都会悲惨地失败.
在D中使用范围的正确方法是什么?(请参阅内联评论以了解我的困惑.)
void print(R)(/* ref? auto ref? neither? */ R r)
{
foreach (x; r)
{
writeln(x);
}
// Million $$$ question:
//
// Will I get back the same things as last time?
// Do I have to check for this every time?
foreach (x; r)
{
writeln(x);
}
}
void test2(alias F, R)(/* ref/auto ref? */ R items)
{
// Will it consume items?
// _Should_ it consume items?
// Will the caller be affected? How do I …Run Code Online (Sandbox Code Playgroud) 我尝试编译以下代码:
import std.algorithm;
void main()
{
string[] x = ["ab", "cd", "ef"]; // 'string' is same as 'immutable(char)[]'
string space = " ";
char z = joiner( x, space ).front(); // error
}
Run Code Online (Sandbox Code Playgroud)
dmd带有错误的结尾编译:
test.d(8): Error: cannot implicitly convert expression (joiner(x,space).front()) of type dchar to char
Run Code Online (Sandbox Code Playgroud)
更改char z为dchar z确定错误消息,但我很感兴趣,为什么它出现在第一位.
为什么结果joiner(string[],string).front()是dchar而不是char?
(文档http://dlang.org/phobos/std_algorithm.html#joiner中没有任何内容)
我重申需要连接格式字符串,并且想知道在D中写入flfln()函数之外连接字符串的最短(或最容易阅读)的方法是什么?
也就是说,我喜欢writefln的行为,例如你可以做的事情:
// Some code to init y="2013", m="01", d="02" ...
writefln("%s-%s-%s", y, m, d);
Run Code Online (Sandbox Code Playgroud)
...但我想这样做而不在stdout上写出来.有同样简单的方法吗?
我发现的唯一想法是std.string中的format函数,但是这需要你提供预定义长度的字符串缓冲区作为第一个参数,这在大多数时候都很不方便.
我发现的另一个选择是(通过在std.array中使用"join"):
// Some code to init y="2013", m="01", d="02" ...
datestr = [y, m, d].join("-");
Run Code Online (Sandbox Code Playgroud)
...这非常方便,但只有当你使用相同的"分隔符"时才有效.
更常见的方法是,这比上面的示例短,并且不需要提供预定义长度的缓冲区字符串?
我刚刚开始查看phobos源代码,它充斥着几种不同的样式并注释掉了代码.
网络方面的风格指南非常小,我只发现2006年的断链和2004年的另一个...
是否有更新,更全面的指南?
PS:本来要求在D.learn新闻组,但我没有得到任何答案,我想我可能会尝试在这里,即使它可能是一个在黑暗中拍摄
我正在学习D,并且因为我得到的错误而感到困惑.
考虑以下:
module helloworld;
import std.stdio;
import std.perf;
ptrdiff_t main( string[] args )
{
auto t = new PerformanceCounter; //From managed heap
//PerformanceCounter t; //On the stack
t.start();
writeln( "Hello, ", size_t.sizeof * 8, "-bit world!" );
t.stop();
writeln( "Elapsed time: ", t.microseconds, " \xb5s." );
return 0;
} //main()
Run Code Online (Sandbox Code Playgroud)
产量非常可观:
Hello, 32-bit world!
Elapsed time: 218 µs.
Run Code Online (Sandbox Code Playgroud)
现在考虑当我尝试在堆栈上初始化PerformanceCounter而不是使用托管堆时会发生什么:
//auto t = new PerformanceCounter; //From managed heap
PerformanceCounter t; //On the stack
Run Code Online (Sandbox Code Playgroud)
产量:
--- killed by signal 10
Run Code Online (Sandbox Code Playgroud)
我很难过.有什么想法为什么这打破?(Mac OS …
我正在D标准库中寻找Set实现,我只发现了这些:
如果我只能弄清楚如何使用它们,这两种方法都可以正常工作.我从RedBlackTree开始(因为我已经熟悉它们是如何工作的),这就是我想出的:
auto rbt = redBlackTree!string();
foreach(s; setOfStrings) {
rbt.insert(s);
}
foreach(s; rbt) {
if (s[0 .. 3] == "sth") {
rbt.removeKey(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在第一个foreach中完成这个条件,但这只是一个示例,表明我需要添加和删除Set中的元素.这会工作,但我得到编译错误:
错误:模板std.container.RedBlackTree(串).RedBlackTree.removeKey(U)如果(!isImplicitlyConvertible(U,ELEM))不匹配任何函数模板声明
错误:!模板std.container.RedBlackTree(串).RedBlackTree.removeKey(U)如果(!isImplicitlyConvertible(U,ELEM))不能从参数类型推断模板函数()(字符串
我不需要红黑树(任何没有重复的东西),速度不是太重要.我可以这样做:
string[] arr;
foreach(s; setOfStrings) {
// check for duplicate code here...
arr ~= s;
}
for(int i = 0; i < arr.length; i++) {
if (s[0 .. 3] == "sth") {
arr = arr[0 .. i] ~ arr[i + 1 .. $];
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
标准库中是否有任何简单的Set?
我试图创建一个在字符串中嵌入数字的纯函数.明显的连接方法不起作用:
pure string foo(immutable int bar)
{
return "Number: " ~ bar; // Error: strings and ints are incompatible.
return "Number: " ~ to!string(bar); // Error: to() is impure.
}
Run Code Online (Sandbox Code Playgroud)
是否有一种干净,实用的方式来连接数字和字符串?我想避免编写自己的连接或转换函数,但如果必须,我会.
如何从文件中轻松构造原始的逐字节InputRange/ForwardRange/RandomAccessRange?