Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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

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


Anatoly Podgoretsky   (2009-12-22 13:04:00) [1]

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

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


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


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


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


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


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


12   (2009-12-22 12:43:00) [3]

ну, типа

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

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

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


brother   (2009-12-22 12:35:00) [4]

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

как обычно


12   (2009-12-22 12:34:00) [5]

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


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


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

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


12   (2009-12-22 12:04:00) [7]

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

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;


Andy BitOff   (2009-12-22 10:20:00) [8]


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

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

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


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

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


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

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


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

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


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

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

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

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

Так - нет.

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

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


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


> 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;


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


oxffff   (2009-12-18 22:07:00) [14]


> Можно ли как-то переписать с 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>. Так в вашем случае обращение по индексу который "инлайнится" гораздо эффективнее.


Anatoly Podgoretsky   (2009-12-18 22:06:00) [15]

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

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


oxffff   (2009-12-18 21:07:00) [16]


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


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

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


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

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

Например:


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 20:49:00) [18]


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


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


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

Спасибо.


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


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


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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо