D文档似乎有点乱,我无法在官方网站上的任何地方找到这些信息.我需要一些常见的异常类型(例如NotFiniteNumberException,FileIOException,类似的类型),这些存在于核心库中,还是我必须自己滚动?
D,作为一堆鲜为人知的语言,在图书馆方面几乎没有什么可去做的.我正在尝试下载一个文件,我可以看到使用DMD 2和phobos的方式是使用etc.c.curl,但是......卷曲很难使用.因为我无法在任何地方找到一个好的例子.如何使用etc.c.curl以最简单的方式下载文件?
该C应如何转换为D:
typedef const gchar* (*GModuleCheckInit) (GModule *module);
typedef void (*GModuleUnload) (GModule *module);
Run Code Online (Sandbox Code Playgroud)
它是否正确 ?
alias const gchar* function( GModule *module ) GModuleCheckInit;
alias void function( GModule *module ) GModuleUnload;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用切片运算符从std.range获取take函数的返回值的切片.我的代码:
auto tempChunk = ['a', 'b', 'c', 'd'];
auto a = tempChunk.take(3);
writeln(a[0..2]);
Run Code Online (Sandbox Code Playgroud)
作为Take!R在这种情况下只是char []的别名,我希望这可以编译.但是,编译器告诉我Take!(char[]) cannot be sliced with [].再举一个例子:
int[] arr1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
auto s = arr.take(5);
writeln(s[0..4]);
Run Code Online (Sandbox Code Playgroud)
这将编译并运行没有问题,打印[1,2,3,4,5].在这一点上我完全感到困惑,为什么第一个例子不起作用,而第二个例子不起作用.
我即将编写一个解析器来逐行读取文本文件到不同类型的结构中,并将这些结构赋予回调(观察者或访问者 - 尚不确定).
该文本文件包含MT-940数据 - SWIFT银行对帐单.
这些行包含一个指定类型的标记和一些字段 - 例如日期 - 应该被解析为我的消息的类型安全成员.其中一些字段是可选的 - 所以我的问题是:我如何在D中表示可选值.
C++提供了你可能知道的boost :: optional之类的东西.
我目前正在通过自己实现一个Optional(T)来解决这个问题(参见本文末尾的代码).它是一个包含ValueHolder实例的结构,该实例可能为null - 这标记了没有赋值的情况.我覆盖了copy-c'tor和赋值运算符,以便在必要时创建ValueHolder的深层副本.
这是要走的路吗?还有其他 - 更简单 - 我看不到的选项吗?
这是我的代码 - 不一定完成功能:
struct Optional(T)
{
class ValueHolder
{
T value;
this(T v)
{
value = v;
}
}
private ValueHolder m_value;
/* Construction without value / with value */
this(T value)
{
m_value = new ValueHolder(value);
}
/* Copy construction / assignment */
ref Optional!(T) opAssign(Optional!(T) rhs)
out
{
if (rhs.m_value !is null)
{
assert(rhs.m_value …Run Code Online (Sandbox Code Playgroud) 这是简单的代码:
import std.algorithm;
import std.array;
import std.file;
void main(string[] args)
{
auto t = args[1].readText()
.splitter('\n')
.split("---")
;
}
Run Code Online (Sandbox Code Playgroud)
看起来它应该工作,但它不会编译.DMD 2.068.2因此错误而失败:
Error: template std.algorithm.iteration.splitter cannot deduce function from
argument types !()(Result, string), candidates are:
...
Error: template instance std.array.split!(Result, string) error instantiating
Run Code Online (Sandbox Code Playgroud)
如果我.array之前插入,它会编译.split.
我错过了什么吗?或者这是一个错误?我试图在bug跟踪器中做一个简短的搜索,但没有找到任何东西.
如何检查数组中的字符串是否出现?我的意思是我可以循环,但是有标准功能吗?
起初我做了:
if(str in ["first", "second", "third"])
Run Code Online (Sandbox Code Playgroud)
但它抱怨in只适用于关联数组.
我试图快速查找phobos文档,但没有找到任何与数组相关的模块.
那么有什么,或者我只需要手动循环它?
我在D1,phobos.
什么是从D中的char []中删除空格的推荐方法,例如使用dmd 2.057,我有,
import std.stdio;
import std.string;
import std.algorithm;
char[] line;
int main(){
line = r"this is a line with spaces ";
line = removechars(line," ");
writeln(line);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译时,这将生成此错误:
Error: cannot implicitly convert expression ("this is a line with spaces ") of type string to char[]
Error: template std.string.removechars(S) if (isSomeString!(S)) does not match any function template declaration
Error: template std.string.removechars(S) if (isSomeString!(S)) cannot deduce template function from argument types !()(char[],string)
Run Code Online (Sandbox Code Playgroud)
在做一些谷歌搜索时,我发现类似的错误被报告为一个错误并且已经在2011年6月提交,但不确定它是指同一件事还是另一个问题.
一般来说,建议从字符串中删除某些字符并将前一个字符数组中的字符顺序排列的方法是什么?
在这种情况下返回 …
我正在使用DMD 2.062 for x86.
module test;
private enum test1
{
one,
two,
three,
}
private enum test2
{
one,
two,
three,
}
auto ct = cartesianProduct([EnumMembers!test1], [EnumMembers!test2]);
unittest
{
import std.stdio;
foreach (n, m; ct)
{
writeln(n, " ", m);
}
}
Run Code Online (Sandbox Code Playgroud)
该程序打印出来:
one one
two one
three one
Run Code Online (Sandbox Code Playgroud)
然后抛出访问冲突错误.我是否错误地使用了cartesianProduct,或者这是函数中的错误?
Phobos是否有一些可变参数算法来定义l值参考参数?就像是
int a=3;
int b=2;
int c=1;
orderInPlace(a,b,c);
// a is now 1
// b is now 2
// c is now 3
Run Code Online (Sandbox Code Playgroud)
另外,一个功能变体,比如order(a, b, c)返回一个元组也会很好.
如果没有,我想我们应该利用std.algorithm:swap.