www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - tuple can write [],but can't read []

reply "FrankLike" <1150015857 qq.com> writes:
Hi,erveryone,

type Tuple!(int,int,int,string)  can write[],but can't read[];

module main;
import std.stdio,std.typecons,std.conv;

void main(string[] argv)
{
             alias Tuple!(int,int,string) tuple2;
	alias Tuple!(int,int,string)[10] tupleS2;

	void bbx(tupleS2 x)
	{
		foreach(v;x)
		{
	

		writeln(v);
			foreach(k;v)
			 writeln(k);
		}
	}
	tupleS2 xy2;

	foreach(i,v;xy2)
	

{
		xy2[i] = tuple2(1,-1,"xy2 :"~i.to!string);
	}
	xy2[1][0]=100;  // can write
	bbx(xy2);


	
	for(int i=0;i<3;i++)
	{
	

	writeln(xy2[0][i]); //  can't read
	}
	
    }
-------------------code end----------------------

if use the  'for(int i=0;i<3;i++)' ,then error.

Error: no [] operator overload for type Tuple!(int, int, int,
int, int, int, int, int, int, int, int, string)	 	

Thank you.

Frank
Apr 29 2014
next sibling parent "Andrea Fontana" <nospam example.com> writes:
On Tuesday, 29 April 2014 at 09:23:03 UTC, FrankLike wrote:
 Hi,erveryone,
 [...]
 	xy2[1][0]=100;  // can write
 [...]
 	writeln(xy2[0][i]); //  can't read
 [...]

If I'm right, index should be a compile-time value.
Apr 29 2014
prev sibling next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
Andrea Fontana:

 If I'm right, index should be a compile-time value.

Right. Because tuples in general don't contain N values of the same type (as in your case), so the compiler has to know statically the index to compute their position efficiently. Further similar questions are better asked in D.learn. I also suggest to not mix tab and spaces to indent code, configure your editor to use only spaces or only tabs (4 spaces is the D standard). Bye, bearophile
Apr 29 2014
prev sibling next sibling parent "FrankLike" <1150015857 qq.com> writes:
On Tuesday, 29 April 2014 at 09:38:45 UTC, Andrea Fontana wrote:
 On Tuesday, 29 April 2014 at 09:23:03 UTC, FrankLike wrote:
 Hi,erveryone,
 [...]
 	xy2[1][0]=100;  // can write
 [...]
 	writeln(xy2[0][i]); //  can't read
 [...]

If I'm right, index should be a compile-time value.

index is exists,but not be read,why? Thank you.
Apr 29 2014
prev sibling next sibling parent "John Colvin" <john.loughran.colvin gmail.com> writes:
On Tuesday, 29 April 2014 at 09:23:03 UTC, FrankLike wrote:
 Hi,erveryone,

 type Tuple!(int,int,int,string)  can write[],but can't read[];

 module main;
 import std.stdio,std.typecons,std.conv;

 void main(string[] argv)
 {
             alias Tuple!(int,int,string) tuple2;
 	alias Tuple!(int,int,string)[10] tupleS2;

 	void bbx(tupleS2 x)
 	{
 		foreach(v;x)
 		{
 	

 		writeln(v);
 			foreach(k;v)
 			 writeln(k);
 		}
 	}
 	tupleS2 xy2;

 	foreach(i,v;xy2)
 	

 {
 		xy2[i] = tuple2(1,-1,"xy2 :"~i.to!string);
 	}
 	xy2[1][0]=100;  // can write
 	bbx(xy2);


 	
 	for(int i=0;i<3;i++)
 	{
 	

 	writeln(xy2[0][i]); //  can't read
 	}
 	
    }
 -------------------code end----------------------

 if use the  'for(int i=0;i<3;i++)' ,then error.

 Error: no [] operator overload for type Tuple!(int, int, int,
 int, int, int, int, int, int, int, int, string)	 	

 Thank you.

 Frank

Tuple indexes must be compile-time values. This will work: import std.stdio, std.typecons, std.conv, std.typetuple; void main() { alias Tuple!(int, int, string) tuple2; alias Tuple!(int, int, string)[10] tupleS2; void bbx(tupleS2 x) { foreach(v; x) { writeln(v); foreach(k;v) writeln(k); } } tupleS2 xy2; foreach(i, v; xy2) { xy2[i] = tuple2(1, -1, "xy2 :" ~ i.to!string); } xy2[1][0]=100; bbx(xy2); foreach(i; TypeTuple!(0,1,2)) { writeln(xy2[0][i]); } }
Apr 29 2014
prev sibling parent "FrankLike" <1150015857 qq.com> writes:
 On Tuesday, 29 April 2014 at 09:53:29 UTC, John Colvin wrote:
 	foreach(i; TypeTuple!(0,1,2))
 	{
 		writeln(xy2[0][i]);
 	}
 }

Thank you,John Colvin, It works very good. Frank.
Apr 29 2014