Типы операторов — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
(Dodge Lighting, http://jzyasybiyb.typepad.com/blog/2012/02/sand-falling-2.html Sand Falling 2, dxtj, http://phmvjqzx.typepad.com/blog/2012/02/itunes-ubuntu-computer.html Itunes Ubuntu Computer, =[[,)
(Bengali Food, http://rolefkow.typepad.com/blog/2012/02/how-to-do-kinky-twist-with-weave.html How To Do Kinky Twist With Weave, jqay, http://abyxqfpwzo.typepad.com/blog/2012/02/itunes-download-vista.h)
Строка 1: Строка 1:
Операторы отличаются от обычных функций тем, что имеют определенные ограничения по количеству
+
Операторы отличаются от обычных функций тем, что имеют определенные ограничения по количеству
аргументов, а также некоторое ожидаемое поведение. Например, оператор + (сложение), принимающий
+
аргументов, а также некоторое ожидаемое поведение. Например, оператор + (сложение), принимающий
более чем один аргумент, выглядел бы глупо. Кроме того, вряд ли кто-то ждет от оператора сложения
+
более чем один аргумент, выглядел бы глупо. Кроме того, вряд ли кто-то ждет от оператора сложения
изменение объекта, для которого он вызван, или аргумента.
+
изменение объекта, для которого он вызван, или аргумента.
  
Рассмотрим различные типы операторов более подробно.
+
Рассмотрим различные типы операторов более подробно.
  
 
i5ZE1g  <a href="http://qmlunrxnlfad.com/">qmlunrxnlfad</a>, [url=http://secdzqkuvdic.com/]secdzqkuvdic[/url], [link=http://wniuyjxuhboe.com/]wniuyjxuhboe[/link], http://vldlnwbycabq.com/
 
i5ZE1g  <a href="http://qmlunrxnlfad.com/">qmlunrxnlfad</a>, [url=http://secdzqkuvdic.com/]secdzqkuvdic[/url], [link=http://wniuyjxuhboe.com/]wniuyjxuhboe[/link], http://vldlnwbycabq.com/
Строка 10: Строка 10:
 
Paced World, http://bycksowleb.typepad.com/blog/2012/02/sample-of-spouse-sponsor-letter.html Sample Of Spouse Sponsor Letter,  956, http://zskwfiedx.typepad.com/blog/2012/02/cold-one-apotamkin-legends.html Cold One Apotamkin Legends,  rmv, http://zvnmdbuo.typepad.com/blog/2012/02/crafts-lighted-tree-topper.html Crafts Lighted Tree Topper,  >:-(, http://xqsktzeu.typepad.com/blog/2012/02/itunes-linux-decrypt.html Itunes Linux Decrypt,  ajofz, http://mjmtkssjb.typepad.com/blog/2012/02/itunes-not-working-quicktime-problem.html Itunes Not Working Quicktime Problem,  8-DDD, http://jrtauoglom.typepad.com/blog/2012/02/itunes-lyrics-use.html Itunes Lyrics Use,  >:-[[[, http://bbjwxwyn.typepad.com/blog/2012/02/contoh-cerita-narasi.html Contoh Cerita Narasi,  935946, http://hjmfhbnpbo.typepad.com/blog/2012/02/glasgow-german-market.html Glasgow German Market,  =-D, http://milhvmweq.typepad.com/blog/2012/02/apple-itunes-contact-details.html Apple Itunes Contact Details,  872, http://puygejkfq.typepad.com/blog/2012/02/sites-like-ifeelmyself.html Sites Like Ifeelmyself,  940, http://iymdsyjk.typepad.com/blog/2012/02/itunes-sync-not-starting.html Itunes Sync Not Starting,  whg, http://ddbstzyilr.typepad.com/blog/2012/02/itunes-sync-quality.html Itunes Sync Quality,  :O, http://ifslqtcngu.typepad.com/blog/2012/02/itunes-movie-trailers-black-swan.html Itunes Movie Trailers Black Swan,  %-OOO, http://jhdgkivn.typepad.com/blog/2012/02/itunes-download-bitrate.html Itunes Download Bitrate,  wjo, http://gqylodwqd.typepad.com/blog/2012/02/pictures-of-safety-rules.html Pictures Of Safety Rules,  nwan, http://efaplseg.typepad.com/blog/2012/02/bypass-facebook-at-work.html Bypass Facebook At Work,  ejgpe, http://beerdywfp.typepad.com/blog/2012/02/how-to-make-a-spun-cotton-ornament.html How To Make A Spun Cotton Ornament,  mljwpx, http://symvdmvz.typepad.com/blog/2012/02/married-cops-do.html Married Cops Do,  >:[[[, http://whzoyosxz.typepad.com/blog/2012/02/acai-capsules-fake.html Acai Capsules Fake,  sru, http://qqxljsydii.typepad.com/blog/2012/02/snowman-plywood-cut-outs.html Snowman Plywood Cut Outs,  8[[,
 
Paced World, http://bycksowleb.typepad.com/blog/2012/02/sample-of-spouse-sponsor-letter.html Sample Of Spouse Sponsor Letter,  956, http://zskwfiedx.typepad.com/blog/2012/02/cold-one-apotamkin-legends.html Cold One Apotamkin Legends,  rmv, http://zvnmdbuo.typepad.com/blog/2012/02/crafts-lighted-tree-topper.html Crafts Lighted Tree Topper,  >:-(, http://xqsktzeu.typepad.com/blog/2012/02/itunes-linux-decrypt.html Itunes Linux Decrypt,  ajofz, http://mjmtkssjb.typepad.com/blog/2012/02/itunes-not-working-quicktime-problem.html Itunes Not Working Quicktime Problem,  8-DDD, http://jrtauoglom.typepad.com/blog/2012/02/itunes-lyrics-use.html Itunes Lyrics Use,  >:-[[[, http://bbjwxwyn.typepad.com/blog/2012/02/contoh-cerita-narasi.html Contoh Cerita Narasi,  935946, http://hjmfhbnpbo.typepad.com/blog/2012/02/glasgow-german-market.html Glasgow German Market,  =-D, http://milhvmweq.typepad.com/blog/2012/02/apple-itunes-contact-details.html Apple Itunes Contact Details,  872, http://puygejkfq.typepad.com/blog/2012/02/sites-like-ifeelmyself.html Sites Like Ifeelmyself,  940, http://iymdsyjk.typepad.com/blog/2012/02/itunes-sync-not-starting.html Itunes Sync Not Starting,  whg, http://ddbstzyilr.typepad.com/blog/2012/02/itunes-sync-quality.html Itunes Sync Quality,  :O, http://ifslqtcngu.typepad.com/blog/2012/02/itunes-movie-trailers-black-swan.html Itunes Movie Trailers Black Swan,  %-OOO, http://jhdgkivn.typepad.com/blog/2012/02/itunes-download-bitrate.html Itunes Download Bitrate,  wjo, http://gqylodwqd.typepad.com/blog/2012/02/pictures-of-safety-rules.html Pictures Of Safety Rules,  nwan, http://efaplseg.typepad.com/blog/2012/02/bypass-facebook-at-work.html Bypass Facebook At Work,  ejgpe, http://beerdywfp.typepad.com/blog/2012/02/how-to-make-a-spun-cotton-ornament.html How To Make A Spun Cotton Ornament,  mljwpx, http://symvdmvz.typepad.com/blog/2012/02/married-cops-do.html Married Cops Do,  >:[[[, http://whzoyosxz.typepad.com/blog/2012/02/acai-capsules-fake.html Acai Capsules Fake,  sru, http://qqxljsydii.typepad.com/blog/2012/02/snowman-plywood-cut-outs.html Snowman Plywood Cut Outs,  8[[,
  
== Операторы присваивания ==
+
== Операторы присваивания ==
  
Оператор присваивания <tt>=</tt> - это оператор, который копирует значение своего аргумента в текущий объект.
+
Оператор присваивания <tt>=</tt> - это оператор, который копирует значение своего аргумента в текущий объект.
  
Кроме того, каждому арифметическому оператору соответствует оператор присваивания, имя которого составляется из
+
Кроме того, каждому арифметическому оператору соответствует оператор присваивания, имя которого составляется из
имени математического оператора плюс символ "=" (например, <tt>+=</tt>). Такие операторы делают соответствующее
+
имени математического оператора плюс символ "=" (например, <tt>+=</tt>). Такие операторы делают соответствующее
математическое действие с текущим объектом.
+
математическое действие с текущим объектом.
  
Операторы присваивания изменяют текущий объект, но не изменяют аргумент. Все они, кроме <tt>~=</tt>, <tt>--=</tt>
+
Операторы присваивания изменяют текущий объект, но не изменяют аргумент. Все они, кроме <tt>~=</tt>, <tt>--=</tt>
и <tt>++=</tt>, принимают ровно один аргумент.
+
и <tt>++=</tt>, принимают ровно один аргумент.
  
Операторы присваивания должны возвращать текущий объект в качестве результата.
+
Операторы присваивания должны возвращать текущий объект в качестве результата.
  
Операторы <tt>--=</tt> и <tt>++=</tt> соответствуют префиксному инкременту и декременту.
+
Операторы <tt>--=</tt> и <tt>++=</tt> соответствуют префиксному инкременту и декременту.
  
Для того же класса <tt>Vector2</tt> из предыдущего примера:
+
Для того же класса <tt>Vector2</tt> из предыдущего примера:
  
 
<source lang="kpp">
 
<source lang="kpp">
Строка 35: Строка 35:
 
</source>
 
</source>
  
== Операторы приведения типов ==
+
== Операторы приведения типов ==
  
Часто бывает так, что одни и те же объекты могут быть представлены различными способами. Например, число 5 может
+
Часто бывает так, что одни и те же объекты могут быть представлены различными способами. Например, число 5 может
быть представлено как целочисленное 5, вещественное 5.0 или в виде строки "5".
+
быть представлено как целочисленное 5, вещественное 5.0 или в виде строки "5".
  
Операторы приведения типов позволяют преобразовывать объекты из одних классов в другие.
+
Операторы приведения типов позволяют преобразовывать объекты из одних классов в другие.
  
Имя такого оператора совпадает с именем класса, в который производится преобразование; оператор не принимает
+
Имя такого оператора совпадает с именем класса, в который производится преобразование; оператор не принимает
параметров и не должен менять текущий объект.
+
параметров и не должен менять текущий объект.
  
При объявлении оператора приведения типа, тип результата функции указывать не следует.
+
При объявлении оператора приведения типа, тип результата функции указывать не следует.
  
Продолжим пример с двумерным вектором. В некоторых задачах бывает целесообразно определить преобразование вектора
+
Продолжим пример с двумерным вектором. В некоторых задачах бывает целесообразно определить преобразование вектора
в вещественное число, возвращающее длину вектора.
+
в вещественное число, возвращающее длину вектора.
Это можно сделать следующим образом:
+
Это можно сделать следующим образом:
  
 
<source lang="kpp">
 
<source lang="kpp">
Строка 57: Строка 57:
 
     }
 
     }
  
// В коде:
+
// В коде:
 
var v = Vector2.create(3.0, 4.0);
 
var v = Vector2.create(3.0, 4.0);
 
var len = v as real; // => 5.0
 
var len = v as real; // => 5.0
Строка 63: Строка 63:
  
  
== Оператор индексного доступа ==
+
== Оператор индексного доступа ==
  
Существует два оператора - <tt>[]</tt> и <tt>[]=</tt> - оператор индексного чтения и оператор индексной записи.
+
Существует два оператора - <tt>[]</tt> и <tt>[]=</tt> - оператор индексного чтения и оператор индексной записи.
  
Оператор индексного чтения принимает не менее одного параметра (возможно более одного), не меняет объект и параметры
+
Оператор индексного чтения принимает не менее одного параметра (возможно более одного), не меняет объект и параметры
и должен возвращать значение - значение элемента по указанным индексам.
+
и должен возвращать значение - значение элемента по указанным индексам.
  
Оператор индексной записи принимает не менее двух параметров. Последний параметр всегда соответствует значению, которое
+
Оператор индексной записи принимает не менее двух параметров. Последний параметр всегда соответствует значению, которое
должно быть записано. Оператор изменяет объект, но не изменяет свои параметры.
+
должно быть записано. Оператор изменяет объект, но не изменяет свои параметры.
  
Для двумерного вектора может быть удобным проиндексировать координаты. В этом случае можно определить следующие операторы:
+
Для двумерного вектора может быть удобным проиндексировать координаты. В этом случае можно определить следующие операторы:
  
 
<source lang="kpp">
 
<source lang="kpp">
Строка 94: Строка 94:
 
     }
 
     }
  
// В коде:
+
// В коде:
 
var v = Vector2.create(0, 0);
 
var v = Vector2.create(0, 0);
 
v[1] = 5;      // => (0, 5)
 
v[1] = 5;      // => (0, 5)
Строка 101: Строка 101:
  
  
== Оператор вызова функции ==
+
== Оператор вызова функции ==
  
Специальный оператор <tt>call</tt> используется для того, чтобы объект можно было бы использовать как функцию.
+
Специальный оператор <tt>call</tt> используется для того, чтобы объект можно было бы использовать как функцию.
Нет никаких ограничений на параметры и поведение этого оператора.
+
Нет никаких ограничений на параметры и поведение этого оператора.
  
Пример:
+
Пример:
  
 
<source lang="kpp">
 
<source lang="kpp">
Строка 116: Строка 116:
 
}
 
}
  
// Использование:
+
// Использование:
 
var greeting = new GreetingPrinter;
 
var greeting = new GreetingPrinter;
greeting("Peter");  // выведет "Hello, Peter!"
+
greeting("Peter");  // выведет "Hello, Peter!"
  
 
function f(const b)
 
function f(const b)
Строка 125: Строка 125:
 
}
 
}
  
f() { |x| puts("Hi, #{x}!"); };  // выведет "Hi, Vova!"
+
f() { |x| puts("Hi, #{x}!"); };  // выведет "Hi, Vova!"
f(new GreetingPrinter);          // выведет "Hello, Vova!"
+
f(new GreetingPrinter);          // выведет "Hello, Vova!"
 
</source>
 
</source>

Версия 04:41, 28 февраля 2012

Операторы отличаются от обычных функций тем, что имеют определенные ограничения по количеству аргументов, а также некоторое ожидаемое поведение. Например, оператор + (сложение), принимающий более чем один аргумент, выглядел бы глупо. Кроме того, вряд ли кто-то ждет от оператора сложения изменение объекта, для которого он вызван, или аргумента.

Рассмотрим различные типы операторов более подробно.

i5ZE1g <a href="http://qmlunrxnlfad.com/">qmlunrxnlfad</a>, [url=http://secdzqkuvdic.com/]secdzqkuvdic[/url], [link=http://wniuyjxuhboe.com/]wniuyjxuhboe[/link], http://vldlnwbycabq.com/

Paced World, http://bycksowleb.typepad.com/blog/2012/02/sample-of-spouse-sponsor-letter.html Sample Of Spouse Sponsor Letter, 956, http://zskwfiedx.typepad.com/blog/2012/02/cold-one-apotamkin-legends.html Cold One Apotamkin Legends, rmv, http://zvnmdbuo.typepad.com/blog/2012/02/crafts-lighted-tree-topper.html Crafts Lighted Tree Topper, >:-(, http://xqsktzeu.typepad.com/blog/2012/02/itunes-linux-decrypt.html Itunes Linux Decrypt, ajofz, http://mjmtkssjb.typepad.com/blog/2012/02/itunes-not-working-quicktime-problem.html Itunes Not Working Quicktime Problem, 8-DDD, http://jrtauoglom.typepad.com/blog/2012/02/itunes-lyrics-use.html Itunes Lyrics Use, >:-[[[, http://bbjwxwyn.typepad.com/blog/2012/02/contoh-cerita-narasi.html Contoh Cerita Narasi, 935946, http://hjmfhbnpbo.typepad.com/blog/2012/02/glasgow-german-market.html Glasgow German Market, =-D, http://milhvmweq.typepad.com/blog/2012/02/apple-itunes-contact-details.html Apple Itunes Contact Details, 872, http://puygejkfq.typepad.com/blog/2012/02/sites-like-ifeelmyself.html Sites Like Ifeelmyself, 940, http://iymdsyjk.typepad.com/blog/2012/02/itunes-sync-not-starting.html Itunes Sync Not Starting, whg, http://ddbstzyilr.typepad.com/blog/2012/02/itunes-sync-quality.html Itunes Sync Quality,  :O, http://ifslqtcngu.typepad.com/blog/2012/02/itunes-movie-trailers-black-swan.html Itunes Movie Trailers Black Swan,  %-OOO, http://jhdgkivn.typepad.com/blog/2012/02/itunes-download-bitrate.html Itunes Download Bitrate, wjo, http://gqylodwqd.typepad.com/blog/2012/02/pictures-of-safety-rules.html Pictures Of Safety Rules, nwan, http://efaplseg.typepad.com/blog/2012/02/bypass-facebook-at-work.html Bypass Facebook At Work, ejgpe, http://beerdywfp.typepad.com/blog/2012/02/how-to-make-a-spun-cotton-ornament.html How To Make A Spun Cotton Ornament, mljwpx, http://symvdmvz.typepad.com/blog/2012/02/married-cops-do.html Married Cops Do, >:[[[, http://whzoyosxz.typepad.com/blog/2012/02/acai-capsules-fake.html Acai Capsules Fake, sru, http://qqxljsydii.typepad.com/blog/2012/02/snowman-plywood-cut-outs.html Snowman Plywood Cut Outs, 8[[,

Содержание

Операторы присваивания

Оператор присваивания = - это оператор, который копирует значение своего аргумента в текущий объект.

Кроме того, каждому арифметическому оператору соответствует оператор присваивания, имя которого составляется из имени математического оператора плюс символ "=" (например, +=). Такие операторы делают соответствующее математическое действие с текущим объектом.

Операторы присваивания изменяют текущий объект, но не изменяют аргумент. Все они, кроме ~=, --= и ++=, принимают ровно один аргумент.

Операторы присваивания должны возвращать текущий объект в качестве результата.

Операторы --= и ++= соответствуют префиксному инкременту и декременту.

Для того же класса Vector2 из предыдущего примера:

<source lang="kpp"> operator Vector2 += (const Vector2 arg) {

   x += arg.x;
   y += arg.y;
   return this;

} </source>

Операторы приведения типов

Часто бывает так, что одни и те же объекты могут быть представлены различными способами. Например, число 5 может быть представлено как целочисленное 5, вещественное 5.0 или в виде строки "5".

Операторы приведения типов позволяют преобразовывать объекты из одних классов в другие.

Имя такого оператора совпадает с именем класса, в который производится преобразование; оператор не принимает параметров и не должен менять текущий объект.

При объявлении оператора приведения типа, тип результата функции указывать не следует.

Продолжим пример с двумерным вектором. В некоторых задачах бывает целесообразно определить преобразование вектора в вещественное число, возвращающее длину вектора. Это можно сделать следующим образом:

<source lang="kpp">

   const operator real ()
   {
       return sqrt( x * x + y * y );
   }

// В коде: var v = Vector2.create(3.0, 4.0); var len = v as real; // => 5.0 </source>


Оператор индексного доступа

Существует два оператора - [] и []= - оператор индексного чтения и оператор индексной записи.

Оператор индексного чтения принимает не менее одного параметра (возможно более одного), не меняет объект и параметры и должен возвращать значение - значение элемента по указанным индексам.

Оператор индексной записи принимает не менее двух параметров. Последний параметр всегда соответствует значению, которое должно быть записано. Оператор изменяет объект, но не изменяет свои параметры.

Для двумерного вектора может быть удобным проиндексировать координаты. В этом случае можно определить следующие операторы:

<source lang="kpp">

   const operator real [] (const int idx)
   {
       switch(idx) {
           case 0: return x;
           case 1: return y;
           default: throw ERangeError.create('index is out of range');
       }
   }
   const operator Vector2 []= (const int idx, const real value)
   {
       switch(idx) {
           case 0: x = value;
           case 1: y = value;
           default: throw ERangeError.create('index is out of range');
       }
   }

// В коде: var v = Vector2.create(0, 0); v[1] = 5; // => (0, 5) var r = v[0]; // => 0 </source>


Оператор вызова функции

Специальный оператор call используется для того, чтобы объект можно было бы использовать как функцию. Нет никаких ограничений на параметры и поведение этого оператора.

Пример:

<source lang="kpp"> class GreetingPrinter {

   public operator call (const string who)
   {
       puts("Hello, #{who}!");
   }

}

// Использование: var greeting = new GreetingPrinter; greeting("Peter"); // выведет "Hello, Peter!"

function f(const b) {

   b("Vova");

}

f() { |x| puts("Hi, #{x}!"); }; // выведет "Hi, Vova!" f(new GreetingPrinter); // выведет "Hello, Vova!" </source>

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты