Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.07;
Скачать: CL | DM;

Вниз

for in - можно ли добраться до переменной итератора?   Найти похожие ветки 

 
Дмитрий Белькевич   (2009-12-18 20:03) [0]

Сабж, собственно. Можно ли внутри цикла как-то достучаться до "итерируемой" переменной из паскалевского кода?


 
oxffff ©   (2009-12-18 20:09) [1]


> Дмитрий Белькевич   (18.12.09 20:03)  
> Сабж, собственно. Можно ли внутри цикла как-то достучаться
> до "итерируемой" переменной из паскалевского кода?


нет.


 
oxffff ©   (2009-12-18 20:17) [2]


> Дмитрий Белькевич   (18.12.09 20:03)


Собственно сохраняется во временную переменную достучаться до которой во первых нельзя(нормальным способом)
А во вторых следуя общему виду

IEnumerator = interface(IInterface)
   function GetCurrent: TObject;
   function MoveNext: Boolean;
   procedure Reset;
   property Current: TObject read GetCurrent;
 end;

Отсутстувует setter значения. Значит и присвоить его нельзя.


 
Дмитрий Белькевич   (2009-12-18 20:33) [3]

Спасибо.


 
oxffff ©   (2009-12-18 20:49) [4]


> Собственно сохраняется во временную переменную достучаться
> до которой во первых нельзя(нормальным способом)


Это я натрындел. Она же не временная.


 
Дмитрий Белькевич   (2009-12-18 21:01) [5]

Так всё таки можно? Или нет? :)

Например:


function BigLetterCount(const s: String): Integer;
var
 i: Integer;
 s1: String;
begin
 Result := 0;
 s1 := AnsiUpperCase(s);
 for i := 1 to Length(s) do
  if (s[i] = s1[i]) and (s[i] <> """") then
   Inc(Result);
end;


Можно ли как-то переписать с for-in? Можно ли как-то до вот этой i добраться в for-in? Она же в цикле всё равно существует.


 
oxffff ©   (2009-12-18 21:07) [6]


> Дмитрий Белькевич   (18.12.09 21:01) [5]


Второе я же оставил.
Смысл итератора в том, чтобы возвращать(перечислять) значения в наборе(колекции) без возможности обновления. То есть природа коллеции не известна, но она может вернуть свои элементы.

IEnumerator = interface(IInterface)
  function GetCurrent: TObject;
  function MoveNext: Boolean;
  procedure Reset;
  property Current: TObject read GetCurrent;
end;


 
Anatoly Podgoretsky ©   (2009-12-18 22:06) [7]

> Дмитрий Белькевич  (18.12.2009 21:01:05)  [5]

А это что религия?


 
oxffff ©   (2009-12-18 22:07) [8]


> Можно ли как-то переписать с for-in?


Вообще можно. Поскольку в вашем коде нет обновления элемента.

var c:char;
for c in S do
if c=AnsiUpperCase(c) and ...

Можно даже написать перечислитель, который будет возвращать значения сравнения. Например так.

TAEnum=class
Uppercasestring:string;
S:string;
idx:integer;
function GetCurrent: boolean;
function MoveNext: Boolean;
property Current: boolean read GetCurrent;
end;

 TForm4 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 s:string;
 function GetEnumerator: TAEnum;
 end;

function TAEnum.GetCurrent: boolean;
begin
result:=(s[idx]=Uppercasestring[idx]) and (s[idx] <> """");
end;

function TAEnum.MoveNext: Boolean;
begin
idx:=idx+1;
result:=not (idx>length(s));
end;

{ TForm4 }

procedure TForm4.FormCreate(Sender: TObject);
var b:boolean;
   a:integer;
begin
s:="StUFf";
a:=0;
for b in self do
 if b then inc(a);
showmessage(inttostr(a));
end;

function TForm4.GetEnumerator: TAEnum;
var a:TAEnum;
   b:boolean;
begin
result:=TAEnum.Create;
result.S:=S;
result.Uppercasestring:=AnsiUpperCase(S);
result.idx:=0;
end;

Но я честное слово в последнее время стал избегать for in по причине потери скорости на равном месте. Что используя обычные массивы, что используя TList<T>. Так в вашем случае обращение по индексу который "инлайнится" гораздо эффективнее.


 
Игорь Шевченко ©   (2009-12-18 22:22) [9]


> function BigLetterCount(const s: String): Integer;
> var
>  i: Integer;
>  s1: String;
> begin
>  Result := 0;
>  s1 := AnsiUpperCase(s);
>  for i := 1 to Length(s) do
>   if (s[i] = s1[i]) and (s[i] <> """") then
>    Inc(Result);
> end;



> Можно ли как-то переписать с for-in?


можно

function BigLetterCount(const s: String): Integer;
var
i: Integer;
с: Char;
begin
Result := 0;
s1 := AnsiUpperCase(s);
for c in s do
 if c = AnsiUpperCase(c)[1] then
   Inc(Result);
end;


Только нужно ли ?


 
Дмитрий Белькевич   (2009-12-18 23:42) [10]

>А это что религия?

Спортивный интерес.

>Только нужно ли ?

Так - нет.

>гораздо эффективнее.

Спасибо, понял. Вопросов больше не имею.


 
Andy BitOff ©   (2009-12-22 10:01) [11]

А с какой версии появилась столь замечательная конструкция "for-in" и даст ли кто ссылочку почитать о ней?


 
brother ©   (2009-12-22 10:11) [12]

http://delphist.ru/for-in-v-delphi/
с 2005


 
brother ©   (2009-12-22 10:11) [13]

зы первая гуглоссылка...


 
Andy BitOff ©   (2009-12-22 10:20) [14]


> brother ©   (22.12.09 10:11) [12]

Спасибо, Брат.
Это я читал, но как-то поверхностно показалось. Я думал, что может какое более подробное, глубокое, что ли, описание. Ну нет, так нет. И на том спасибо.

ЗЫ, с гуглом подколол ;)


 
12 ©   (2009-12-22 12:04) [15]

или я чего не понимаю?

var
i:integer;
begin
for i:=0 to 10 do
begin
   memo1.Lines.Add(inttostr(i));
   if i=5 then
   asm
      mov i,7
   end;
end;
end;


 
Германн ©   (2009-12-22 12:08) [16]


> 12 ©   (22.12.09 12:04) [15]
>
> или я чего не понимаю?
>

Не понимаешь :)


 
12 ©   (2009-12-22 12:34) [17]

а.. for-in
у меня 7ка, нет такого да и что-то не представляю зачем нужно
значит, от лукавого :)


 
brother ©   (2009-12-22 12:35) [18]

> значит, от лукавого :)

как обычно


 
12 ©   (2009-12-22 12:43) [19]

ну, типа

почитал
http://delphist.ru/for-in-v-delphi/

все можно переписать (да там и переписано, собственно, в примерах) без for-in

понятно, что и в маш.кодах можно писать было всю жизнь и не придумывать ту же делфю, но все-таки в таком операторе(?) как for-in что-то не вижу большого смысла/удобства


 
Дмитрий Белькевич   (2009-12-22 12:55) [20]


> или я чего не понимаю?


Специально написал: "из паскалевского кода". Из асма можно, думаю,  переменную вытянуть (по крайней мере, в некоторых, частных, случаях), но нет смысла - лучше for to оставить.


> как for-in что-то не вижу большого смысла/удобства


Код проще и понятнее.


 
Anatoly Podgoretsky ©   (2009-12-22 13:04) [21]

> 12  (22.12.2009 12:04:15)  [15]

Ну ты и хакер :-)



Страницы: 1 вся ветка

Текущий архив: 2011.08.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.008 c
1-1261155802
Дмитрий Белькевич
2009-12-18 20:03
2011.08.07
for in - можно ли добраться до переменной итератора?


2-1304064514
OW
2011-04-29 12:08
2011.08.07
можно иметь два указателя на один Excel, разных типов?


2-1302093582
Гость
2011-04-06 16:39
2011.08.07
Копирование масссива на ассемблере BASM (пара вопросов)


1-1261562629
DL
2009-12-23 13:03
2011.08.07
парсин строки имени файла


15-1303122801
DiamondShark
2011-04-18 14:33
2011.08.07
Мобильные браузеры (WM)