Форум: "Основная";
Текущий архив: 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