Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.08.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.003 c
2-1302509942
Максон
2011-04-11 12:19
2011.08.07
StringGrid и таблица Word


2-1304061097
Dzmitry
2011-04-29 11:11
2011.08.07
большая картинка


2-1303980851
stud92
2011-04-28 12:54
2011.08.07
отношение между таблицами бд


15-1303019199
Inovet
2011-04-17 09:46
2011.08.07
Монеты, посвященные олипиаде в Сочи 2014


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский