Trong khi chơi đùa với D 2.0 tôi thấy vấn đề sau đây:Làm thế nào để sử dụng tinh khiết trong D 2.0
Ví dụ 1:
pure string[] run1()
{
string[] msg;
msg ~= "Test";
msg ~= "this.";
return msg;
}
này biên dịch và làm việc như mong đợi.
Khi tôi cố gắng quấn mảng chuỗi trong một lớp học tôi thấy tôi không thể có được điều này để làm việc:
class TestPure
{
string[] msg;
void addMsg(string s)
{
msg ~= s;
}
};
pure TestPure run2()
{
TestPure t = new TestPure();
t.addMsg("Test");
t.addMsg("this.");
return t;
}
Mã này sẽ không biên dịch bởi vì chức năng addMsg là không tinh khiết. Tôi không thể làm cho hàm đó thuần khiết vì nó làm thay đổi đối tượng TestPure. Tôi có thiếu gì đó không? Hay đây là một hạn chế?
Sau đây không biên dịch:
pure TestPure run3()
{
TestPure t = new TestPure();
t.msg ~= "Test";
t.msg ~= "this.";
return t;
}
có các ~ = điều hành chưa được thực hiện như một hàm bất tịnh của mảng msg? Làm thế nào đến trình biên dịch không phàn nàn về điều đó trong hàm run1?
Tôi đã cố gắng xóa thẻ [thẻ: thuần], vì đôi khi nó đề cập đến các hàm ảo thuần túy, đôi khi là [thuần] (http://beebole.com/pure/) và đôi khi thành [pure] (http://en.wikipedia.org/wiki/Pure_ (programming_language)) - trong số những thứ khác. Nhưng tôi không biết gì về [tag: d2]. Bạn có thể xác nhận xem chỉnh sửa thẻ của tôi có phù hợp không? [Tag: hoàn toàn chức năng] có hoạt động cho câu hỏi này không - tôi đã tạo [tag: pure-function], vì vậy nếu [tag: purely-functional] hoạt động, tôi nghĩ sẽ tốt hơn nếu sử dụng thẻ hiện tại. –