You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Monday, June 6th 2011, 10:50pm

D Programming Language 2.0 -> const oder in?

Mit D2.0 wurde ja die Bedeutung von "in" als Storage Class als alias für const geändert. Was würdet ihr eher verwenden, wenn ihr sicherstellen wollt, dass ein Paraeter nicht mehr geändert wird im Funktionskopf?
"in "

C# Quellcode

1
int calculate(in ushort x, in ushort y) {


oder "const "

C# Quellcode

1
int calculate(const ushort x, const ushort y) {


oder gar nichts

C# Quellcode

1
int calculate(ushort x, ushort y) {

?

Einfach mal so Interessen halber.
"in" ist kürzer (und als Programmierer ist man ja eher faul), allerdings ist "const" Aussagekräftiger.
Deswegen wollt ich mal rumfragen (evtl. macht ja Thorben 'ne Umfrage draus).

Gruß

2

Tuesday, June 7th 2011, 10:49am

wenn ich das richtig sehe, ist in ist kein alias von const, sondern von const scope.

3

Tuesday, June 7th 2011, 11:18am

Und inwiefern ist dort nun ein immenser Unterschied? Es ist ein Synonym für const bzw. sorgt dafür, genau wie const, dass der Parameter nicht geändert werden darf/kann. Im Falle eines Arrays auch dafür, dass keins der Elemente geändert werden kann.
Und zu was würdest du tendieren?

4

Tuesday, June 7th 2011, 12:05pm

Wie sich const scope zu const (als Parameter) verhält kann ich dir nicht sagen, das müsste man mal durchtesten.

Das gleiche ist es nicht .... die Frage ist, ob die Auswirkungen die selben sind. Wenn das der Fall ist, was mich wundern würde, dann sehe ich keinen Grund für die Nutzung von in.

5

Tuesday, June 7th 2011, 12:19pm

Also ich habe noch keinen wirklichen Unterschied feststellen können, denn auch wenn ich mittels typeid die Parameter mir ausgeben lasse, sehe ich bei beiden const(PARAM). Auch bei diesem Test (wir brauchen hier mal einen D Syntax):

C# Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import std.stdio;
 
struct Node {
	void print(in byte nr) const {
		writefln("Node print [%d]", nr);
	}
}
 
class Parent {
	this(in Node n) {
		n.print(0);
		writeln(typeid(n));
	}
 
	this(const Node n) {
		n.print(1);
		writeln(typeid(n));
	}
 
	void init(in int[] array) {
		writeln("in");
		writeln(typeid(array));
		//array[0] = array[0] + 42;
		foreach (ref int e; array) {
			writeln(e);
			//e++;
		}
	}
 
	void init_(const int[] array) {
		writeln("const");
		writeln(typeid(array));
		//array[0] = array[0] + 42;
		foreach (ref int e; array) {
			writeln(e);
			//e++;
		}
	}
}
 
 
void main() {
	Node n = Node();
	auto p = new Parent(n);
	p.init([1, 2, 3, 4, 5, 6, 7, 8, 9,]);
	p.init_([1, 2, 3, 4, 5, 6, 7, 8, 9,]);
}

(die auskommentierten Zeilen wurden mir angekriedet, gerade wegen der const Beziehung)

bekam ich zu aller erst dies hier:

Quoted

C:\Users\White\Desktop\d zauberei>dmd const_ref.d
const_ref.d(42): Error: constructor const_ref.Parent.this called with argument t
ypes:
((Node))
matches both:
const_ref.Parent.this(in const(Node) n)
and:
const_ref.Parent.this(const const(Node) n)


Und nachdem ich den Konsturktor mit dem const Parameter auskommentiert hatte, dies:

Quoted

Node print [0]
const(const_ref.Node)
in
const(const(int)[])
1
2
3
4
5
6
7
8
9
const
const(const(int)[])
1
2
3
4
5
6
7
8
9

Also scheint intern beides gleich behandelt zu werden.
Du würdest also const verwenden? Und wenn, weswegen? Aussagekräftiger, Gewohnheit?

6

Tuesday, June 7th 2011, 1:16pm

Wenn man in der doc zu den functions ein bisschen rumwühlt, gibt es dazu keine eindeutigen Erkenntnisse :wacko:

Wenn ich das richtig verstanden habe, dann sollen die hauptsächlich noch unterstützten storage classes in, out, ref, lazy und none sein.

Inkonsequent ist, dass die "alten" (immutable, scope, const, final) Bezeichner noch alle unterstützt, in der 2.0er Version übernommen und nirgends aus deprecated gekennzeichnet wurden.



Zumindestens macht dann die Einführung und Bezeichnung von in einen Sinn und wäre für mich dann dem const vorzuziehen.


C# Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void abc(out int x) {
    x = 2;
}
int y = 3;
abc(y); // y=2
 
////////////  
 
void abc(in int x) {
    x = 2;
}
int y = 3;
abc(y); // y=3
 
////////////  
 
void abc(ref int x) {
    x += 1;
}
int z = 3;
abc(z); // z=4

7

Tuesday, June 7th 2011, 1:33pm

Soweit ich weiß wird final für Klassen und const weiterhin für Methode, welche als Unveränderlich gekennzeichnet werden sollen, gebraucht.

C# Quellcode

1
void abc(in int x) const {

Und immutable wurde doch erst gerade mit Version 2 eingeführt.

8

Wednesday, June 8th 2011, 9:53am

hi,

ich meinte das in Bezug auf die Parameter storage classes.


Für eine normale Konstante macht const, anstatt in, auch mehr Sinn.

Ja, hast du Recht, immutable kam neu dazu ... ich bin bei D auch schon länger "raus" ^^



Soweit ich weiß wird final für Klassen und const weiterhin für Methode, welche als Unveränderlich gekennzeichnet werden sollen, gebraucht.

Das wäre ja fast die Antwort auf deine anfängliche Frage ;)

Offizielle Konventionen von D hab ich nicht gefunden, aber wenn man sich an die inout storage classes hält, dann brauch man bei den Parametern kein const, immutable etc. mehr.

9

Wednesday, June 8th 2011, 11:00am

Aber soweit ich gelesen habe, ist auch nicht in Planung, diese "alten" Storage Klassen abzuschaffen.
Ich denke ich werde const nehmen, da sich in und ref bspw nicht kombinieren lassen, const und ref allerdings schon.

Similar threads

Social bookmarks