在下面的代码示例中,milk由构造函数初始化,而egg不是.milk.spill()不是段错误,但egg.crack()确实如此.初始化实例变量的两种方法有什么区别?为什么前者正确而后者导致段错误?
import std.stdio;
void main() {
auto k = new Kitchen();
k.pollute();
}
class Kitchen {
Milk milk;
Egg egg = new Egg();
this() {
milk = new Milk();
}
void pollute() {
writeln("spilling milk");
milk.spill();
writeln("cracking egg");
egg.crack();
}
}
class Milk {
bool spilt = false;
void spill() { spilt = true; }
}
class Egg {
bool cracked = false;
void crack() { cracked = true; }
}
Run Code Online (Sandbox Code Playgroud) 我想要一个数字列表:
auto nums = iota(0, 5000);
Run Code Online (Sandbox Code Playgroud)
现在nums是类型Result.它不能被强制转换int[],也不能用作替代品int[].
从文档中不太清楚如何实际使用iota作为范围.我使用了错误的功能吗?在D中制作"范围"的方法是什么?
是否可以显式调用struct copy构造函数,就像在C++中一样?我可以写这样的东西:
struct foo {
void bar() {}
}
foo f;
foo(f).bar();
Run Code Online (Sandbox Code Playgroud)
或者我总是需要为一些varialbe分配新值?
import std.range : cycle;
void foo() pure @safe {
cycle([1, 2]);
}
Run Code Online (Sandbox Code Playgroud)
今天我遇到了用D语言编写的程序.我试图了解它的汇编代码,从一个简单的函数开始.
pure nothrow @nogc @safe std.range.Cycle!(int[]).Cycle std.range.cycle!(int[]).cycle(int[]):
push rbp
mov rbp,rsp
sub rsp,0x40
mov QWORD PTR [rbp-0x20],rdi
mov QWORD PTR [rbp-0x10],rsi
mov QWORD PTR [rbp-0x8],rdx
... rest of the function
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几次读它,但无法理解为什么
std.range.cycle()得到3个参数(RDI,RSI和RDX),或者我的范围是([1, 2]).它不是一个类似C的结构?
或者我错过了什么?
我怎么std::vector<std::unique<foo>> p在D 表达?
Array!(Unique!Foo) p
Run Code Online (Sandbox Code Playgroud)
问题是Array似乎需要this(this)哪些已被禁用Unique.我不确定为什么Array首先需要一个postblit构造函数.
bool isUnit(Vec)(in Vec v, float tolerance = kindaSmallNumber){
import std.math: abs;
import std.conv: to;
auto length = v.lengthSquared;
return abs(to!(typeof(length))(1) - length) < tolerance;
}
Run Code Online (Sandbox Code Playgroud)
这里我只想计算,1 - length但长度可以是double或float类型.我不想将1从整数转换为float或double在运行时.
我必须做to!(typeof(length))(1) - length或者我能做什么,1 - length并且1总是和长度一样?
D(相当稀疏)的官方文档没有关于在*nx或Windows上处理系统信号的任何信息.
该system模块只有Endian和OS,syserror已被弃用/仅对Windows ERRORTEXT,并且signals是大约消息传递,而不是系统的信号.
是否有一种方法(在纯D中)安装信号处理程序,捕获并允许我在运行时对某些信号作出反应,或者至少是一种检测信号被接收的方法和我可以的异常catch?
即,在Python中,一个简单的例子是:
import signal
signal.signal(signal.SIGSEGV, myFunctionToHandleSEGV)
# ...
Run Code Online (Sandbox Code Playgroud) 我今天刚开始学习D,我真的需要读取和写入这样的数据:
byte[] bytes = ...;
ByteBuffer buf = new ByteBuffer(bytes);
int a = buf.getInt();
byte b = buf.getByte();
short s = buf.getShort();
buf.putInt(200000);
Run Code Online (Sandbox Code Playgroud)
D中有什么内容可以实现这一点,还是我必须自己制作?
在D中,我可以直接在声明上初始化并期望初始化表达式是构造函数的一部分吗?我来自C#,就是这样.但随着DMD 2.071.0我得到其他行为.
class Other { }
class Test { Other nonStaticMember = new Other; }
void test()
{
auto t1 = new Test;
auto t2 = new Test;
// Assert is failing, the two Test instances are
// being initialized to the same reference
// instead of execute the Other constructor twice.
assert(t1.nonStaticMember !is t2.nonStaticMember);
}
Run Code Online (Sandbox Code Playgroud)
如果这是意图行为,应在此处记录:https://dlang.org/spec/class.html 对吗?
是否有可能为代表避免使用GC?
我正在建立一个任务系统.我有一个带有本地任务队列的N-Threads.任务队列基本上只是一个Array!Fiber tasks.因为不鼓励将光纤发送到不同的线程,所以我向一个线程发送一个闭包/委托,从该委托创建光纤并将其放入数组中tasks.
现在我发送的代表是捕获变量的委托.
//Some Pseudo code
auto f = //some function;
auto cell = Cell(...);
auto del = () {
let res = f();
cell.write(res);
}
send(del);
Run Code Online (Sandbox Code Playgroud)
}
现在,单元格被堆分配并与原子计数器同步.然后,我可以检查原子计数器cell是否已经达到0,如果它已经,我可以安全地读取它.
问题是代理人捕获变量,在GC上分配变量.现在我只分配一个指针,这可能不是一个大问题,但我仍然想避免使用GC.
我该怎么做?
d ×10
abi ×1
assembly ×1
bytearray ×1
bytebuffer ×1
class ×1
constructor ×1
dmd ×1
initializer ×1
range ×1
read-write ×1
signals ×1
std ×1
x86-64 ×1