
Модератор: Модераторы

{$mode objfpc}
{$modeswitch typehelpers}
{$modeswitch allowinline}
type
TStringUtils = type helper for String
  function IndexOf(const Sub: String): Integer; inline;
end;
function TStringUtils.IndexOf(const Sub: String): Integer;
begin
  Result := Pos(Sub, Self);
end;
begin
  Writeln('ABCDEF'.IndexOf('CD'));
end.

float Power(float, float);Pos(substr = 'lawl', str = 'aw');result := TPos.Create('lawl').SetSubStr('aw').Eval;result := Pos('lawl').SetSubStr('aw').Eval;result := Pos.SetStr('lawl').SetSubStr('aw').Eval;var
  pos: TPos;
begin
  pos.Str := 'lawl';
  pos.SubStr := 'aw';
  result := pos.Eval;
result := Pos(substr: 'lawl', str: 'aw');NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
hinst писал(а):Я думаю, что фичу делать не надо, так как решение есть, которое я описал.
hinst писал(а): Это я видел в жабе:
- Код: Выделить всё
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
Называется pattern Builder, и используется он там немного для других целей, как я понял, для того, чтобы создать объект и сразу назначить ему некоторые значения для свойств
пример отсюда: http://habrahabr.ru/post/86252/
Добавлено спустя 3 минуты 8 секунд:
то есть, там предлагают это использовать для создания экземпляров классов и назначения им свойств, а не для того, чтобы использовать это как вызов функции с именоваными параметрами, как это предлагаю я
var
  p: TPos;
begin
  p.SearchWhat('bla').search(); // а вот SearchWhere я не вызвал.
 зато вызвать функцию напрямую сможешь.
 зато вызвать функцию напрямую сможешь.type
  { TPos }
  TPos = class
  public
    What: string;
    Where: string;
  end;
  TPosArg = object
    o: TPos;
  end;
  { TPosFinal }
  TPosFinal = object(TPosArg)
    function Eval: Integer;
  end;
  { TPosWhat }
  TPosWhat = object(TPosArg)
    function SetWhat(const s: string): TPosFinal;
  end;
  { TPosWhere }
  TPosWhere = object(TPosArg)
    function SetWhere(const s: string): TPosWhat;
  end;
function Pos: TPosWhere;
...implementation...
{ TPosWhere }
function TPosWhere.SetWhere(const s: string): TPosWhat;
begin
  o.Where := s;
  result.o := o;
end;
{ TPosFinal }
function TPosFinal.Eval: Integer;
begin
  result := system.Pos(o.What, o.Where);
  o.Free;
end;
{ TPosWhat }
function TPosWhat.SetWhat(const s: string): TPosFinal;
begin
  o.What := s;
  result.o := o;
end;
{ NoClass }
function Pos: TPosWhere;
begin
  result.o := TPos.Create;
end;
begin
  WriteLN(
    Pos.SetWhere('lawl').SetWhat('aw').Eval
  );
end.Pos.SetWhere('lawl').SetWhat('aw').Eval // можно
Pos.SetWhat('aw').Eval // нельзя
Pos.SetWhat('aw').SetWhere('lawl').Eval // нельзя

 жесть. Вот паскалевский способ не забыть порядок
 жесть. Вот паскалевский способ не забыть порядок function FindSubInStr(const sub, s: string): Integer; {inline; - по желанию}
begin
  Result:=Pos(sub, s);
end;
SSerge писал(а):Вам уже перечислили конкретную библиотеку и конкретную функцию, наименования параметров которой ни о чем не говорят, к тому же экземпляры для разных типов аргументов эти самые параметры именуют по-разному; что есть безусловное зло, но вам этого не понять, потому что вы изначально встали в позицию отрицания;
hinst писал(а):Я знаю как ещё и сделать чтобы нельзя было пропустить нужный параметр:

hinst писал(а):не всё так просто
hinst писал(а):не всё так просто
 
   
   
   ь!
 ь!function Pos(sub, s: string) as FindSubInStr(const sub, s: string): Integer;
Mirage писал(а):Выучивать - путь к ошибкам.
 Невыучивание чего угодно, ведёт к непредасказуемым результатам.
 Невыучивание чего угодно, ведёт к непредасказуемым результатам.Mirage писал(а):P.S.: На builder паттерн наехали зря, т.к. он нужен и удобен для безопасного создания immutable объектов, когда у объекта имеются необязательные параметры.
Mirage писал(а):Обязательные задаются при создании builder'а, читаем внимательней.
Mirage писал(а):Было бы очень здорово, если бы immutable объекты давали те же гарантии в FPC, что и в Java.
Но т.к. иммутабельных объектов в FPC нет, то данный паттерн можно реализовать без дополнительного класса, просто сделав чтобы методы-сеттеры дополнительных параметров возвращали экземпляр того же класса.
Mirage писал(а):Это модно называть fluent interfaces. Толку, правда, от этого мало.

Wikipedia писал(а):...нацеленный на повышение читабельности исходного кода программы....

program project1;
{$Mode ObjFPC}
type
  TLal = record
    x, y: Integer;
  end;
const
  lal: TLal = (x: 0; y: 0);
var
  lal2: TLal;
begin
  lal2 := lal;
end.
begin
  lal2 := (x: 0; y: 0);
  // или так
  lal2 := TLal(x: 0; y: 0);
end.
Pos( TPos(sub: '23'; str: '1234') );

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1