Object Pascal

Поделись знанием:
Перейти к: навигация, поиск
Object Pascal
Семантика:

мультипарадигмальный:
императивный, структурный, объектно-ориентированный, обобщённый[1], процедурный

Класс языка:

язык программирования

Тип исполнения:

компилируемый

Появился в:

1986

Автор:

Ларри Теслер, Никлаус Вирт

Расширение файлов:

.p, .pp, .pas

Система типов:

статическая, динамическая (array of const, RTTI, Variant), строгая

Основные реализации:

Delphi (x86 and CLI), Oxygene (CLI), Free Pascal (x86, x86-64, PowerPC, ppc64, SPARC and ARM), Virtual Pascal (x86), TMT Pascal (x86), Turbo51 (Intel 8051)

Диалекты:

Apple, Turbo Pascal, objfpc, Delphi, Delphi.NET, Oxygene

Испытал влияние:

Паскаль, Smalltalk

Повлиял на:

C#, Java

Object Pascal (с англ. — «Объектный Паскаль») — язык программирования, разработанный в фирме Apple Computer в 1986 году группой Ларри Теслера, который консультировался с Никлаусом Виртом. Произошёл от более ранней объектно-ориентированной версии Паскаль[2], называвшейся Clascal, который был доступен на компьютере Apple Lisa.





Изменения в Object Pascal от Borland в сравнении с Turbo Pascal

Изменения коснулись групп целых, символьных и строковых типов, которые стали разделяться на две категории:

  • Фундаментальные (fundamental) типы. Их представление в памяти (число битов и наличие знака) строго фиксируется и выдерживается неизменным во всех последующих реализациях Object Pascal для любых операционных систем и компьютерных платформ.
  • Родовые (generic) типы. Их представление в памяти не фиксируется и будет реализовано оптимальным способом, в зависимости от реализации для конкретной операционной системы и компьютерной платформы.

Интерфейсы

См. Интерфейсы: Delphi

Перегрузка процедур и функций (не ООП)

Введена перегрузка процедур и функций, не являющихся членами объекта или класса. Перегружаются (с помощью ключевого слова overload) отличающиеся типами и числом параметров процедуры и функции :

procedure Calc(I: Integer); overload;
// ...
procedure Calc(S: String; J: Integer); overload;

Динамический массив

Введен для устранения рутинных операций выделения и возвращения памяти в heap-область (кучу), и для того, чтобы избежать случайных ошибок и утечки памяти. Элементы массива должны быть одинаковыми. Нумерация элементов начинается с нуля.

Пример объявления:

var MyFlexibleArray: array of Real;

Использование:

var
  A, B: array of Integer;
begin
  SetLength(A, 1); //Выделяем память под один элемент
  A[0] := 1;   B := A;
  B[0] := 2;
end;

Начиная с Delphi XE7 стали возможны следующие действия с динамическими массивами:

var M: array of integer;
begin
  M:=[1,2,3,4,5];
end;

 M := M + [5, 6, 7];
 Insert([6, 7, 8], M, 5); //вставка массива [6, 7, 8], в M, начиная с индекса 5
 Delete(M, 1, 3); //удаляем 3 элемента, начиная с индекса 1
 Concat([1,2,3,4],[5,6,7])

То есть с динамическими массивами можно работать также как и с обычными строками.

В динамическом массиве тоже возможно задание открытого массива параметров, но тип их должен быть объявлен ранее, например:

type TDynamicCharArray = array of Char;
function Find(A: TDynamicCharArray): Integer;

Динамическая типизация

Операторы динамической проверки и приведения типов

В языке Object Pascal фирмы Borland появилась динамическая типизация, а также оператор динамического приведения типов as и оператор is для динамической проверки типов. Также в открытом массиве параметров стала возможна передача параметров различного типа (variant open array parameters).

Вариантный тип

В языке Object Pascal был введен вариантный тип данных (Variant), тип которых не известен на этапе компиляции и может изменяться на этапе выполнения программы. Однако этот тип данных поглощает больше памяти по сравнению с соответствующими переменными и операции над данными типа Variant выполняются медленнее. Более того, недопустимые операции над данными этого типа чаще приводят к ошибкам на этапе выполнения программы, в то время как подобные ошибки над данными другого типа были бы выявлены ещё на этапе компиляции.

Вариантные переменные могут принимать различные значения (целые, строковые, булевские, Currency, OLE-строки), быть массивами элементов этих же типов и массивом значений вариантного типа, а также содержать COM и CORBA объекты, чьи методы и свойства могут быть доступны посредством этого типа. Однако Variant не может содержать:

  • данные структурных типов;
  • указатели;
  • Int64 (начиная с Delphi 6 — может).

Variant можно смешивать (в выражениях и операторах) с другими вариантами, числовыми, строковыми и булевскими данными. При этом компилятор автоматически выполняет преобразование типа. Варианты, содержащие строки, не могут, однако, индексироваться (V[i] не допустимо).

var
  V1, V2, V3, V4, V5: Variant;
  I: Integer;
  D: Double;
  S: String;
begin
  V1 := 1; //значение типа integer
  V2 := 359.768; //значение типа real
  V3 := 'Hello world!'; //значение типа string
end;

Параметры типа вариантного открытого массива

Стала возможна передача параметров различного типа. В оригинале он назван как «variant open array parameters». Тип данных определяется динамически в процессе выполнения программы. Так же как и в обычном открытом массиве функция High вызывается для определения числа элементов массива. Для объявления используются ключевые слова array of const. Пример:

function Output(const Args: array of const): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to High(Args) do with Args[I] do
    case VType of
      vtString:     Result := Result + VString^;
      vtPChar:      Result := Result + VPChar;
      vtInteger:    Result := Result + IntToStr(VInteger);
      vtBoolean:    Result := Result + BoolToStr(VBoolean);
      vtChar:       Result := Result + VChar;
      vtExtended:   Result := Result + FloatToStr(VExtended^);
      vtObject:     Result := Result + VObject.ClassName;
      vtClass:      Result := Result + VClass.ClassName;
      vtVariant:    Result := Result + string(VVariant^);
      vtInt64:      Result := Result + IntToStr(VInt64^);
      vtAnsiString: Result := Result + string(VAnsiString);
      vtCurrency:   Result := Result + CurrToStr(VCurrency^);
    end;

  Result := Result + ' ';
end;
//...

Output(['test', 777, '@', True, 3.14159, TForm]); //передача открытого массива параметров

Будет возвращена строка: «test 777 @ T 3.14159 TForm».

Как видно, имеет свою внутреннюю структуру, обращение к которой дает возможность определить тип данных. В строке вызова функции создается массив, с помощью конструктора открытого массива, который использует квадратные скобки.

Различия в объектных моделях

Для введения новой объектной модели введено ключевое слово classTurbo Pascal ключевое слово object).

Введены операторы для проверки и приведения классов is и as динамически в ходе выполнения программы. Появились указатели на методы, для чего введено новое использование ключевого слова object:

type
  TMyMethod = procedure (Sender : Object) of object;

Изменения синтаксиса, из-за изменения размещения объектов

В Turbo Pascal можно было работать как с динамическими, так и со статическими экземплярами объектов.

В объектной модели Object Pascal программист работает только с динамическими экземплярами классов, выделяемых в heap-области (куче). В связи с этим изменен синтаксис обращения к полям и методам объектов.

Ранее для работы с динамическими экземплярами объектов, инициализированными с использованием обращения к конструктору в сочетании с функцией New, необходимо было использовать обращение по указателю (^). Теперь тип класса стал являться по умолчанию также указателем.

Пример для сравнения:

Объектная модель в Turbo Pascal:

type
  PMyObject = ^TMyObject;
  TMyObject = object (TObject)
    MyField : PMyType;
    constructor Init;
  end;
//...
var
  MyObject : PMyObject;
begin
  MyObject := New(PMyObject,Init);
  MyObject^.MyField := //...
end;

Новая объектная модель в Object Pascal:

type
  TMyObject = class (TObject)
    MyField : TMyType;
    constructor Create;
  end;
//...
var
  MyObject : TMyObject;
begin
  MyObject := TMyObject.Create;
  MyObject.MyField := //...
end;

Было изменено соглашение об именовании конструкторов и деструкторов. В старой объектной модели вызов New отвечал за распределение памяти, а обращение к конструктору инициализировало выделенную область памяти. В новой модели эти действия выполняет конструктор Create. Начиная с версии Delphi XE появились статические методы класса.[3]

Появилась возможность ограничивать видимость членов класса (методы, свойства), которые предназначены для использования только в реализации производных классов. Это дает возможность защищать исходный код от модификации пользователями класса. Такие методы содержатся в секции protected (защищённые) в объявлении класса.

Визуальное объектно-ориентированное программирование

Появились понятия свойства (property) и связанные с со свойствами ключевые слова read, write, stored, default (nodefault), index. Свойства визуальных объектов, видимых в интегрированной среде разработки объявляются с помощью нового слова published в качестве секции в объявлении класса, являющегося визуальным объектом.

Обобщения

type
  {объявление}
  generic TList<T> = class
    Items: array of T;
    procedure Add(Value: T);
  end;

implementation
  {реализация}
  procedure TList.Add(Value: T);
  begin
    SetLength(Items, Length(Items) + 1);
    Items[Length(Items) - 1] := Value;
  end;

Общий класс может быть просто специализирован для конкретного типа с использованием ключевого слова specialize:

type
  TIntegerList = specialize TList<Integer>;
  TPointerList = specialize TList<Pointer>;
  TStringList  = specialize TList<string>;

Перегрузка операторов

Разработчики TMT Pascal (модификация Object Pascal) первыми ввели полноценную перегрузку операторов, что впоследствии было перенято разработчиками других диалектов языка: Delphi (с Delphi 2005), Free Pascal и др.

Пример:

{объявление}
type
  TVector = packed record
    A, B, C: Double;
    procedure From(const A, B, C: Double);
    class operator Add(const Left, Right: TVector): TVector;
    class operator Implicit(const v: TVector): TPoint;
  end;

{реализация}
implementation
//...
  class operator TVector.Add(const Left, Right: TVector): TVector;
  begin
    Result.A := Left.A + Right.A;
    Result.B := Left.B + Right.B;
    Result.C := Left.C + Right.C;
  end;

  class operator TVector.Implicit(const v: TVector): TPoint;
  begin
    Result.A := round(v.A);
    Result.B := round(v.B);
  end;
//...

{использование}
var
  v1, v2: TVector;
begin
  v1.From(20, 70, 0);
  v2.From(15, 40, 4);
  Canvas.Polygon([v1, v2, v1 + v2]);
end;

Поддержка различными разработчиками

Начиная с версии среды Delphi 7, фирма Borland стала официально называть язык Object Pascal как Delphi[4].

Язык Object Pascal поддерживается и развивается другими разработчиками. Наиболее серьёзные реализации Object Pascal (помимо Delphi) — это кроссплатформенный TopSpeed Pascal (версия языка Turbo Pascal[5]) мультиязыковой среды TopSpeed, TMT Pascal, Virtual Pascal, PascalABC.NET, Free Pascal, GNU Pascal. Язык программирования Oxygene является диалектом Object Pascal для платформы .NET и дальнейшим его развитием, а новыми возможностями языка является оператор ":", асинхронный и отложенный вызовы методов, асинхронное выполнение блока кода, параллельные циклы, анонимные конструкторы, элементы контрактного и аспектно-ориентированного программирования и др.[6] (компилятор распространяется без ограничений).

Примеры «Hello, world!» в различных объектных расширениях языка

Напишите отзыв о статье "Object Pascal"

Примечания

  1. [hallvards.blogspot.com/2007/08/highlander2-beta-generics-in-delphi-for.html Hallvard’s Blog: Highlander2 Beta: Generics in Delphi for .NET]
  2. Буч Г. Объектно-ориентированное проектирование с примерами применения К.: Диалектика; М.: Конкорд, 1992. — 519 с.
  3. [www.interface.ru/iarticle/files/25458_53867033.pdf Преимущества перехода на Delphi XE Что нового по сравнению с Delphi 7 Андреано Лануш (Andreano Lanusse)],Ноябрь 2010 г. Embarcadero Technologies Россия, СНГ
  4. [docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devcommon/overview_xml.html Delphi Language Overview]
  5. [www.nf-team.org/drmad/stuff/t.htm TopSpeed-компиляторы: не дожили до триумфа]
  6. [codmasters.ru/thread-33-1-1.html Remobjects Oxygene]
  7. Michaël Van Canneyt. [www.freepascal.org/docs-html/ref/refch6.html#x66-760006 Chapter 6: Classes] (англ.). Free Pascal : Reference guide. (декабрь 2011). Проверено 16 января 2012. [www.webcitation.org/659qF0xXI Архивировано из первоисточника 2 февраля 2012].


Отрывок, характеризующий Object Pascal

– Нет, я поеду, непременно поеду, – сказала решительно Наташа. – Данила, вели нам седлать, и Михайла чтоб выезжал с моей сворой, – обратилась она к ловчему.
И так то быть в комнате Даниле казалось неприлично и тяжело, но иметь какое нибудь дело с барышней – для него казалось невозможным. Он опустил глаза и поспешил выйти, как будто до него это не касалось, стараясь как нибудь нечаянно не повредить барышне.


Старый граф, всегда державший огромную охоту, теперь же передавший всю охоту в ведение сына, в этот день, 15 го сентября, развеселившись, собрался сам тоже выехать.
Через час вся охота была у крыльца. Николай с строгим и серьезным видом, показывавшим, что некогда теперь заниматься пустяками, прошел мимо Наташи и Пети, которые что то рассказывали ему. Он осмотрел все части охоты, послал вперед стаю и охотников в заезд, сел на своего рыжего донца и, подсвистывая собак своей своры, тронулся через гумно в поле, ведущее к отрадненскому заказу. Лошадь старого графа, игреневого меренка, называемого Вифлянкой, вел графский стремянной; сам же он должен был прямо выехать в дрожечках на оставленный ему лаз.
Всех гончих выведено было 54 собаки, под которыми, доезжачими и выжлятниками, выехало 6 человек. Борзятников кроме господ было 8 человек, за которыми рыскало более 40 борзых, так что с господскими сворами выехало в поле около 130 ти собак и 20 ти конных охотников.
Каждая собака знала хозяина и кличку. Каждый охотник знал свое дело, место и назначение. Как только вышли за ограду, все без шуму и разговоров равномерно и спокойно растянулись по дороге и полю, ведшими к отрадненскому лесу.
Как по пушному ковру шли по полю лошади, изредка шлепая по лужам, когда переходили через дороги. Туманное небо продолжало незаметно и равномерно спускаться на землю; в воздухе было тихо, тепло, беззвучно. Изредка слышались то подсвистыванье охотника, то храп лошади, то удар арапником или взвизг собаки, не шедшей на своем месте.
Отъехав с версту, навстречу Ростовской охоте из тумана показалось еще пять всадников с собаками. Впереди ехал свежий, красивый старик с большими седыми усами.
– Здравствуйте, дядюшка, – сказал Николай, когда старик подъехал к нему.
– Чистое дело марш!… Так и знал, – заговорил дядюшка (это был дальний родственник, небогатый сосед Ростовых), – так и знал, что не вытерпишь, и хорошо, что едешь. Чистое дело марш! (Это была любимая поговорка дядюшки.) – Бери заказ сейчас, а то мой Гирчик донес, что Илагины с охотой в Корниках стоят; они у тебя – чистое дело марш! – под носом выводок возьмут.
– Туда и иду. Что же, свалить стаи? – спросил Николай, – свалить…
Гончих соединили в одну стаю, и дядюшка с Николаем поехали рядом. Наташа, закутанная платками, из под которых виднелось оживленное с блестящими глазами лицо, подскакала к ним, сопутствуемая не отстававшими от нее Петей и Михайлой охотником и берейтором, который был приставлен нянькой при ней. Петя чему то смеялся и бил, и дергал свою лошадь. Наташа ловко и уверенно сидела на своем вороном Арабчике и верной рукой, без усилия, осадила его.
Дядюшка неодобрительно оглянулся на Петю и Наташу. Он не любил соединять баловство с серьезным делом охоты.
– Здравствуйте, дядюшка, и мы едем! – прокричал Петя.
– Здравствуйте то здравствуйте, да собак не передавите, – строго сказал дядюшка.
– Николенька, какая прелестная собака, Трунила! он узнал меня, – сказала Наташа про свою любимую гончую собаку.
«Трунила, во первых, не собака, а выжлец», подумал Николай и строго взглянул на сестру, стараясь ей дать почувствовать то расстояние, которое должно было их разделять в эту минуту. Наташа поняла это.
– Вы, дядюшка, не думайте, чтобы мы помешали кому нибудь, – сказала Наташа. Мы станем на своем месте и не пошевелимся.
– И хорошее дело, графинечка, – сказал дядюшка. – Только с лошади то не упадите, – прибавил он: – а то – чистое дело марш! – не на чем держаться то.
Остров отрадненского заказа виднелся саженях во ста, и доезжачие подходили к нему. Ростов, решив окончательно с дядюшкой, откуда бросать гончих и указав Наташе место, где ей стоять и где никак ничего не могло побежать, направился в заезд над оврагом.
– Ну, племянничек, на матерого становишься, – сказал дядюшка: чур не гладить (протравить).
– Как придется, отвечал Ростов. – Карай, фюит! – крикнул он, отвечая этим призывом на слова дядюшки. Карай был старый и уродливый, бурдастый кобель, известный тем, что он в одиночку бирал матерого волка. Все стали по местам.
Старый граф, зная охотничью горячность сына, поторопился не опоздать, и еще не успели доезжачие подъехать к месту, как Илья Андреич, веселый, румяный, с трясущимися щеками, на своих вороненьких подкатил по зеленям к оставленному ему лазу и, расправив шубку и надев охотничьи снаряды, влез на свою гладкую, сытую, смирную и добрую, поседевшую как и он, Вифлянку. Лошадей с дрожками отослали. Граф Илья Андреич, хотя и не охотник по душе, но знавший твердо охотничьи законы, въехал в опушку кустов, от которых он стоял, разобрал поводья, оправился на седле и, чувствуя себя готовым, оглянулся улыбаясь.
Подле него стоял его камердинер, старинный, но отяжелевший ездок, Семен Чекмарь. Чекмарь держал на своре трех лихих, но также зажиревших, как хозяин и лошадь, – волкодавов. Две собаки, умные, старые, улеглись без свор. Шагов на сто подальше в опушке стоял другой стремянной графа, Митька, отчаянный ездок и страстный охотник. Граф по старинной привычке выпил перед охотой серебряную чарку охотничьей запеканочки, закусил и запил полубутылкой своего любимого бордо.
Илья Андреич был немножко красен от вина и езды; глаза его, подернутые влагой, особенно блестели, и он, укутанный в шубку, сидя на седле, имел вид ребенка, которого собрали гулять. Худой, со втянутыми щеками Чекмарь, устроившись с своими делами, поглядывал на барина, с которым он жил 30 лет душа в душу, и, понимая его приятное расположение духа, ждал приятного разговора. Еще третье лицо подъехало осторожно (видно, уже оно было учено) из за леса и остановилось позади графа. Лицо это был старик в седой бороде, в женском капоте и высоком колпаке. Это был шут Настасья Ивановна.
– Ну, Настасья Ивановна, – подмигивая ему, шопотом сказал граф, – ты только оттопай зверя, тебе Данило задаст.
– Я сам… с усам, – сказал Настасья Ивановна.
– Шшшш! – зашикал граф и обратился к Семену.
– Наталью Ильиничну видел? – спросил он у Семена. – Где она?
– Они с Петром Ильичем от Жаровых бурьяно встали, – отвечал Семен улыбаясь. – Тоже дамы, а охоту большую имеют.
– А ты удивляешься, Семен, как она ездит… а? – сказал граф, хоть бы мужчине в пору!
– Как не дивиться? Смело, ловко.
– А Николаша где? Над Лядовским верхом что ль? – всё шопотом спрашивал граф.
– Так точно с. Уж они знают, где стать. Так тонко езду знают, что мы с Данилой другой раз диву даемся, – говорил Семен, зная, чем угодить барину.
– Хорошо ездит, а? А на коне то каков, а?
– Картину писать! Как намеднись из Заварзинских бурьянов помкнули лису. Они перескакивать стали, от уймища, страсть – лошадь тысяча рублей, а седоку цены нет. Да уж такого молодца поискать!
– Поискать… – повторил граф, видимо сожалея, что кончилась так скоро речь Семена. – Поискать? – сказал он, отворачивая полы шубки и доставая табакерку.
– Намедни как от обедни во всей регалии вышли, так Михаил то Сидорыч… – Семен не договорил, услыхав ясно раздававшийся в тихом воздухе гон с подвыванием не более двух или трех гончих. Он, наклонив голову, прислушался и молча погрозился барину. – На выводок натекли… – прошептал он, прямо на Лядовской повели.
Граф, забыв стереть улыбку с лица, смотрел перед собой вдаль по перемычке и, не нюхая, держал в руке табакерку. Вслед за лаем собак послышался голос по волку, поданный в басистый рог Данилы; стая присоединилась к первым трем собакам и слышно было, как заревели с заливом голоса гончих, с тем особенным подвыванием, которое служило признаком гона по волку. Доезжачие уже не порскали, а улюлюкали, и из за всех голосов выступал голос Данилы, то басистый, то пронзительно тонкий. Голос Данилы, казалось, наполнял весь лес, выходил из за леса и звучал далеко в поле.
Прислушавшись несколько секунд молча, граф и его стремянной убедились, что гончие разбились на две стаи: одна большая, ревевшая особенно горячо, стала удаляться, другая часть стаи понеслась вдоль по лесу мимо графа, и при этой стае было слышно улюлюканье Данилы. Оба эти гона сливались, переливались, но оба удалялись. Семен вздохнул и нагнулся, чтоб оправить сворку, в которой запутался молодой кобель; граф тоже вздохнул и, заметив в своей руке табакерку, открыл ее и достал щепоть. «Назад!» крикнул Семен на кобеля, который выступил за опушку. Граф вздрогнул и уронил табакерку. Настасья Ивановна слез и стал поднимать ее.
Граф и Семен смотрели на него. Вдруг, как это часто бывает, звук гона мгновенно приблизился, как будто вот, вот перед ними самими были лающие рты собак и улюлюканье Данилы.
Граф оглянулся и направо увидал Митьку, который выкатывавшимися глазами смотрел на графа и, подняв шапку, указывал ему вперед, на другую сторону.
– Береги! – закричал он таким голосом, что видно было, что это слово давно уже мучительно просилось у него наружу. И поскакал, выпустив собак, по направлению к графу.
Граф и Семен выскакали из опушки и налево от себя увидали волка, который, мягко переваливаясь, тихим скоком подскакивал левее их к той самой опушке, у которой они стояли. Злобные собаки визгнули и, сорвавшись со свор, понеслись к волку мимо ног лошадей.
Волк приостановил бег, неловко, как больной жабой, повернул свою лобастую голову к собакам, и также мягко переваливаясь прыгнул раз, другой и, мотнув поленом (хвостом), скрылся в опушку. В ту же минуту из противоположной опушки с ревом, похожим на плач, растерянно выскочила одна, другая, третья гончая, и вся стая понеслась по полю, по тому самому месту, где пролез (пробежал) волк. Вслед за гончими расступились кусты орешника и показалась бурая, почерневшая от поту лошадь Данилы. На длинной спине ее комочком, валясь вперед, сидел Данила без шапки с седыми, встрепанными волосами над красным, потным лицом.
– Улюлюлю, улюлю!… – кричал он. Когда он увидал графа, в глазах его сверкнула молния.
– Ж… – крикнул он, грозясь поднятым арапником на графа.
– Про…ли волка то!… охотники! – И как бы не удостоивая сконфуженного, испуганного графа дальнейшим разговором, он со всей злобой, приготовленной на графа, ударил по ввалившимся мокрым бокам бурого мерина и понесся за гончими. Граф, как наказанный, стоял оглядываясь и стараясь улыбкой вызвать в Семене сожаление к своему положению. Но Семена уже не было: он, в объезд по кустам, заскакивал волка от засеки. С двух сторон также перескакивали зверя борзятники. Но волк пошел кустами и ни один охотник не перехватил его.


Николай Ростов между тем стоял на своем месте, ожидая зверя. По приближению и отдалению гона, по звукам голосов известных ему собак, по приближению, отдалению и возвышению голосов доезжачих, он чувствовал то, что совершалось в острове. Он знал, что в острове были прибылые (молодые) и матерые (старые) волки; он знал, что гончие разбились на две стаи, что где нибудь травили, и что что нибудь случилось неблагополучное. Он всякую секунду на свою сторону ждал зверя. Он делал тысячи различных предположений о том, как и с какой стороны побежит зверь и как он будет травить его. Надежда сменялась отчаянием. Несколько раз он обращался к Богу с мольбою о том, чтобы волк вышел на него; он молился с тем страстным и совестливым чувством, с которым молятся люди в минуты сильного волнения, зависящего от ничтожной причины. «Ну, что Тебе стоит, говорил он Богу, – сделать это для меня! Знаю, что Ты велик, и что грех Тебя просить об этом; но ради Бога сделай, чтобы на меня вылез матерый, и чтобы Карай, на глазах „дядюшки“, который вон оттуда смотрит, влепился ему мертвой хваткой в горло». Тысячу раз в эти полчаса упорным, напряженным и беспокойным взглядом окидывал Ростов опушку лесов с двумя редкими дубами над осиновым подседом, и овраг с измытым краем, и шапку дядюшки, чуть видневшегося из за куста направо.