Một thay thế bên cạnh việc sử dụng C con trỏ kiểu arithmetics là template safe_data
, tức là làm một cái gì đó như thế này :
import std.stdio;
import std.traits;
void safe_data(T)(in T arr) {
static if(isArray!T) {
writeln("Length ", arr.length); // do some ugly stuff for whole array
foreach(e; arr) safe_data(e); // recursively go deeper
} else {
writeln("Element ", arr); // do more ugly stuff on individual elements
}
}
void main() {
writeln("A");
int[3] A = [1,2,3];
safe_data(A);
writeln("B");
int[3][2] B = [[1,2,3],[4,5,6]];
safe_data(B);
}
Tùy thuộc vào những gì bạn muốn làm gì với dữ liệu, bạn có thể muốn sử dụng ref
thay vì trên in
. BTW, nếu bạn thích, bạn có thể di chuyển các static if
bên ngoài của chức năng mà làm cho mã sạch hơn đôi khi:
// handle arrays
void safe_data(T)(in T arr) if(isArray!T) {
writeln("Length ", arr.length); // do some ugly stuff for whole array
foreach(e; arr) safe_data(e); // recursively go deeper
}
// handle array elements
void safe_data(T)(in T e) if(!isArray!T) {
writeln("Element ", e); // do more ugly stuff on individual elements
}
Chỉ cần những gì tôi đang tìm kiếm! Tôi không hiểu rõ các mẫu nhưng ví dụ của bạn rất rõ ràng. –
@Pedro: bạn được chào đón. Nếu bạn muốn tuần tự hóa dữ liệu, Orange (http://www.dsource.org/projects/orange) có thể đáng xem. – stephan