Блоки — различия между версиями

Материал из Deeptown Manual
Перейти к: навигация, поиск
(http://maharray.blogg.se/2011/december/les-anges-du-peche-1943-movie-downloads.html Les anges du peche pride Les anges du peche fan fiction Nightmare Castle images http://maharray.blogg.se/2011/decem)
(http://esisoc.over-blog.com/article-small-soldiers-1998-online-download-95870716.html best Small Soldiers game Small Soldiers watch http://www.ign.com/blogs/litedvolo/2011/12/31/how-to-watch-the-full)
Строка 38: Строка 38:
 
http://umalin.jugem.jp/?eid=1 The Queen of Hearts length The Queen of Hearts movie characters
 
http://umalin.jugem.jp/?eid=1 The Queen of Hearts length The Queen of Hearts movie characters
  
== Типизация параметров ==
+
http://esisoc.over-blog.com/article-small-soldiers-1998-online-download-95870716.html best Small Soldiers game Small Soldiers watch
 
+
http://www.ign.com/blogs/litedvolo/2011/12/31/how-to-watch-the-full-film-of-jackass-the-movie-2002-documentary/ Jackass: The Movie games watch Jackass: The Movie movie online
В некоторых случаях, для повышения эффективности кода блока можно типировать формальные параметры, с тем чтобы впоследствии компилятор, на основании этой информации, мог бы генерировать статический код. Типирование аргументов осуществляется точно так же, как и в обычных функциях: непосредственно перед идентификатором аргумента, указывается его тип.
+
http://bilibeg.jugem.jp/?eid=1 High School Musical 3: Senior Year group High School Musical 3: Senior Year film to watch now
<source lang="kpp">
+
Balls of Fury full film online http://bilibeg.jugem.jp/?eid=2 Balls of Fury filestube
var myblock = { | int x, int y | /* код блока */ };
+
http://bilibeg.jugem.jp/?eid=3 Runaway Jury tracksuit Runaway Jury rating
</source>
+
Certified Copy music director http://dailybooth.com/myonido270/21851341 tickets to Certified Copy
Теперь, в теле блока, переменные ''x'' и ''y'' будут считаться статическими.  
+
http://dailybooth.com/myonido270/21851345 buy Blind Justice suit download Blind Justice trilogy
 
+
http://dailybooth.com/myonido270/21851348 Veda - Ataturk song mp3 song at the end of Veda - Ataturk
'''Примечание 1:''' Поскольку на момент компиляции, у компилятора нет возможности проверить правильность типов передаваемых в блок параметров, ответственность за это ложится на самого программиста. Если в блок будет передан объект неприводимого типа, то это приведет к ошибке времени исполнения ([[Идеология языка#Понятие исключения|исключению]]).
+
Murders in the Rue Morgue movie price http://dailybooth.com/myonido270/21851369 i want to watch the full film of Murders in the Rue Morgue online
 
+
http://dailybooth.com/myonido270/21851382 watch The Game of Their Lives full movie online your own The Game of Their Lives
'''Примечание 2:''' Указание типов в параметрах может быть удобно, поскольку компилятор, располагая информацией о типе параметров, может выполнять некоторую работу автоматически. Например, приводить переменные к нужному типу при вызове других функций. Допустим, мы хотим описать некоторый блок, который по логике работы принимает число (переменную типа <tt>int</tt>), но внутри себя вызывает другие функции, скажем <tt>puts()</tt>:
+
http://dailybooth.com/myonido270/21851393 pre order Unseen Evil 2 tickets animated Unseen Evil 2
 
+
http://bilibeg.jugem.jp/?eid=4 Boarding School online promotional code 3d Boarding School games
<source lang="kpp" line="1">
+
picture of Summer City http://bilibeg.jugem.jp/?eid=5 Summer City release dvd
var myblock = { |x|
+
Silver Surfer movie posters http://dailybooth.com/myonido270/21851423 last Silver Surfer movie
    /* код блока */  
+
http://bilibeg.jugem.jp/?eid=6 new york The Naked Trucker and T-Bones Show download The Naked Trucker and T-Bones Show online
    puts(x to string);
+
http://slimserritha.eklablog.com/buy-the-film-ugly-me-2006-a29166298 Ugly Me dvd price Ugly Me release date dvd
};
+
http://bilibeg.jugem.jp/?eid=7 movie quality The Freshman The Freshman playing near me
</source>
+
Sharpe s Revenge suit for sale http://slimserritha.eklablog.com/sharpe-s-revenge-1997-tv-movie-film-website-a29166344 remote control Sharpe s Revenge
 
+
Mesto vstrechi izmenit nelzya dvd release http://bakrepanc.blogg.se/2012/january/download-mesto-vstrechi-izmenit-nelzya-1979.html movies like Mesto vstrechi izmenit nelzya
В данном случае, в строке 3, при вызове <tt>puts()</tt>, нам пришлось привести тип переменной ''x'' к строке явным образом. Если бы этого не было сделано, то возникла бы ошибка времени исполнения, поскольку функция <tt>puts()</tt> ожидает строку. При небольших размерах кода это не составляет проблем, однако приводить тип переменной пришлось бы в каждом вызове. Для решения этой проблемы как раз рекомендуется применять типирование аргументов:
+
 
+
<source lang="kpp" line="1">
+
var myblock = { | int x |
+
    /* код блока */  
+
    puts(x); //теперь, приведение происходит автоматически
+
};
+
</source>
+
  
 
== Встроенные блоки ==
 
== Встроенные блоки ==

Версия 00:03, 3 января 2012

Содержание


Основной идеей при написании как процедурных, так и объектно-ориентированных программ является локализация (заключение) функционала в некоторой области: в функции, либо в методе. Таким образом получается, что программа состоит из множества функционально независимых частей, каждая из которых решает конкретную, достаточно узкую задачу. Такой подход позволяет скрыть детали реализации алгоритмов внутри этих частей, а "наружу" предоставить только интерфейс — совокупность способов взаимодействия данного функционального элемента с другими. В случае функции, под интерфейсом понимается совокупность ее параметров и возвращаемого значения; в случае классов — наборы методов и свойств.

Случается, что в работе некоторого алгоритма возникают четко определенные функциональные подсистемы, которые, однако, слишком зависимы от самого алгоритма, либо слишком просты для того, чтобы выделять их в отдельную функцию. В случае с C++ это все же приходится делать, даже если эта "минифункция" применяется всего в одном методе, но достаточное количество раз, чтобы программист не захотел копировать эти строки.

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

И в том и в другом случае на помощь приходят замыкания, анонимные функции или лямбда функции, как их еще называют. Сущность такой функции в том, что она с одной стороны как бы является переменной, а с другой стороны — функцией, которую можно вызывать. В языке К++, такие функции носят название блоков. Сущность переменной, блоки проявляют в том что их можно создавать как локальные переменные, присваивать друг другу и даже передавать другим функциям в качестве параметра. Приняв такой параметр, функция может обратиться к нему, как к любой другой функции: вызывать с некоторыми параметрами и использовать его возвращаемое значение: <source lang="kpp"> function Caller(x, y, block b) {

   return b(x, y);

} </source>

Приведем простой пример объявления блоков и их передачи в вышеописанную функцию: <source lang="kpp"> var sum = { |x, y| return x + y; }; var mul = { |x, y| return x * y; }; var s = Caller(2, 3, sum); // s = 2 + 3 = 5 var m = Caller(2, 5, mul); // m = 2 * 5 = 10 </source>

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

XeNnsN <a href="http://aqfplfwlrdip.com/">aqfplfwlrdip</a>, [url=http://ejycmszseqro.com/]ejycmszseqro[/url], [link=http://cccsigzuayoi.com/]cccsigzuayoi[/link], http://bilcsnigisim.com/

http://maharray.blogg.se/2011/december/les-anges-du-peche-1943-movie-downloads.html Les anges du peche pride Les anges du peche fan fiction Nightmare Castle images http://maharray.blogg.se/2011/december/watch-nightmare-castle-1965-film-high-quali.html Nightmare Castle labs http://diaphopa.jugem.jp/?eid=5 Words of Devotion download full film watch Words of Devotion volume http://maharray.blogg.se/2011/december/cheap-chance-2009-film.html Chance film series best quality Chance film Manchild actor list http://maharray.blogg.se/2011/december/the-movie-manchild-2002-tv-series.html Manchild fan characters Kickboxing Academy http://diaphopa.jugem.jp/?eid=6 free Kickboxing Academy game download Screw Loose movie in theaters http://maharray.blogg.se/2011/december/watch-screw-loose-1999-movies-online.html names of Screw Loose http://maharray.blogg.se/2011/december/where-can-i-buy-back-to-the-planet-of-the-ape.html director Back to the Planet of the Apes Back to the Planet of the Apes audiobooks http://diaphopa.jugem.jp/?eid=7 Dr ending extended Dr two towers Cruel Passion 3d version http://maharray.blogg.se/2011/december/cruel-passion-1977-film-to-watch-now.html Cruel Passion original http://umalin.jugem.jp/?eid=1 The Queen of Hearts length The Queen of Hearts movie characters

http://esisoc.over-blog.com/article-small-soldiers-1998-online-download-95870716.html best Small Soldiers game Small Soldiers watch http://www.ign.com/blogs/litedvolo/2011/12/31/how-to-watch-the-full-film-of-jackass-the-movie-2002-documentary/ Jackass: The Movie games watch Jackass: The Movie movie online http://bilibeg.jugem.jp/?eid=1 High School Musical 3: Senior Year group High School Musical 3: Senior Year film to watch now Balls of Fury full film online http://bilibeg.jugem.jp/?eid=2 Balls of Fury filestube http://bilibeg.jugem.jp/?eid=3 Runaway Jury tracksuit Runaway Jury rating Certified Copy music director http://dailybooth.com/myonido270/21851341 tickets to Certified Copy http://dailybooth.com/myonido270/21851345 buy Blind Justice suit download Blind Justice trilogy http://dailybooth.com/myonido270/21851348 Veda - Ataturk song mp3 song at the end of Veda - Ataturk Murders in the Rue Morgue movie price http://dailybooth.com/myonido270/21851369 i want to watch the full film of Murders in the Rue Morgue online http://dailybooth.com/myonido270/21851382 watch The Game of Their Lives full movie online your own The Game of Their Lives http://dailybooth.com/myonido270/21851393 pre order Unseen Evil 2 tickets animated Unseen Evil 2 http://bilibeg.jugem.jp/?eid=4 Boarding School online promotional code 3d Boarding School games picture of Summer City http://bilibeg.jugem.jp/?eid=5 Summer City release dvd Silver Surfer movie posters http://dailybooth.com/myonido270/21851423 last Silver Surfer movie http://bilibeg.jugem.jp/?eid=6 new york The Naked Trucker and T-Bones Show download The Naked Trucker and T-Bones Show online http://slimserritha.eklablog.com/buy-the-film-ugly-me-2006-a29166298 Ugly Me dvd price Ugly Me release date dvd http://bilibeg.jugem.jp/?eid=7 movie quality The Freshman The Freshman playing near me Sharpe s Revenge suit for sale http://slimserritha.eklablog.com/sharpe-s-revenge-1997-tv-movie-film-website-a29166344 remote control Sharpe s Revenge Mesto vstrechi izmenit nelzya dvd release http://bakrepanc.blogg.se/2012/january/download-mesto-vstrechi-izmenit-nelzya-1979.html movies like Mesto vstrechi izmenit nelzya

Встроенные блоки

Чаще всего, блоки применяются для записи небольших кусочков кода, которые, как в примерах выше, передаются в функции, для уточнения некоторых моментов. Для того чтобы облегчить работу программиста и сделать код более читаемым, был введен специальный синтаксис для передачи блоков в функции с одновременным их объявлением "на месте"; при этом, блоки записываются в сокращенной форме сразу за кодом вызова функции, после блока фактических параметров.

Покажем использование встроенных блоков на примере нахождения суммы чисел от 1 до 10, а так же получения списка четных чисел в этом же интервале. <source lang="kpp"> var s = 0; var numbers = []; (1..10).each() { |x| s += x; numbers.push(x); }; var evens = numbers.collect() { |x| x % 2 == 0 ? x : null; }.compact(); </source>

Несмотря на свою простоту и надуманность, данный пример показывает две особенности встроенных блоков, по сравнению с обычными блоками, объявляемыми как переменные. Первая особенность заключается в том, что встроенные блоки имеют доступ к локальным переменным в контексте вызова (то есть, замыкаются на него — отсюда и название "замыкания"). Например, данный блок использует внешние по отношению к нему переменные: s для накопления суммы, а numbers для добавления текущего числа в массив.

Вторая особенность реализуется в коде второго встроенного блока. Она заключается в том, что встроенные блоки могут возвращать значения без явного указания оператора return. Однако, это вожможно только для простых выражений, без применения операторов ветвления. Для получения массива целых чисел, используются два метода, объявленные в стандартной библиотеке языка K++: методы collect() и compact().

Метод collect() принимает в качестве аргумента блок. Далее, он проходит вдоль всего массива, вызывая блок с параметром текущего элемента. Результат выполнения блока помещается в другой массив, который возвращается вызывающему коду. Таким образом, этот метод может применяться для обработки элементов некоторого массива с получением другого массива из обработанных элементов. Метод compact() используется для "уплотнения" массива, путем удаления из него пустых элементов, равных null.

В вышеприведенном коде, мы используем оба этих метода для того, чтобы сначала выбрать из исходного массива все четные элементы (вместо нечетных вставляется null), а затем уплотнить полученный массив.

Реализованы эти методы могут быть примерно так: <source lang="kpp"> extend array {

   public const function array collect(block b) {
       var array result;
       this.each() { |x| result.push(b(x)); };
       return result;
   }
   public const function array compact() {
       var array result;
       this.each() { |x| result.push(b(x)) if x; };
       return result;
   }

} </source>

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

Сама функция, должна работать с ними "как есть"; ни в коем случае нельзя их сохранять во внешних переменных (где они могут просуществовать дольше положенного времени). Например, такой код является недопустимым: <source lang="kpp"> var block_array = []; function AddBlock(block b) { block_array.push(b); } function f() {

   const c = 5;
   AddBlock() { |x| x * c; }; // так делать нельзя!

} </source> В коде блока мы видим использование внешнего объекта — константы c. Проблема заключается в том, что встроенные блоки не порождают собственного контекста и заимствуют набор локальных переменных из контекста вызова. Соответственно, если блок был где то сохранен, то может случиться, что контект его локальных переменных был уже удален.

В то же время, такой код вполне правомерен: <source lang="kpp"> function f() {

   var b = { |x| return x + 1; }; // а так можно
   AddBlock(b); 
   //так тоже можно, но не рекомендуется:
   AddBlock({|x| return x * 5;}); 

} </source>

Примечание 2: хотя использование связки collect(){...}.compact() не возбраняется, следует иметь в виду, что происходит двойное копирование массивов, что в конечном счете сказывается на производительности. Для задачи выбора (а не обработки) элементов из массива, более приемлемым вариантом является использование метода select(), который отбирает из исходного массива все элементы, удовлетворяющие условию, записанному в блоке:

<source lang="kpp"> var ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var selected = ary.select() { |x| x > 6; }; // [7, 8, 9, 10] </source>

При использовании метода select() промежуточного копирования не происходит, так что операция будет выполняться более эффективно.



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

К примеру, вот пример кода, который обращается на FTP сервер и выбирает из некоторой директории все файлы, имеющие расширение '.conf': <source lang="kpp"> var configs = Directory.open('ftp://example.com/media/etc')

   .browse().select() { |file| file.name =~ `\.conf$`; };

</source>

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

Учитывая принципы полудинамической типизации, некоторые конструкции могут быть более лаконичными даже по сравнению с подобными языками. Например, следующий код на C# 2.0 позволяет увеличить все элементы массива на 2: <source lang="csharp"> int[] ary = { 1, 2, 3 }; int x = 2; Array.ConvertAll<int, int>(ary, delegate(int elem) { return elem * x; }); // { 2, 4, 6 } </source>

На K++ эта же конструкция будет выглядеть так: <source lang="kpp"> var ary = [1, 2, 3]; var x = 2; ary.convert() { |e| e * x; }; // [2, 4, 6] </source>

Конечно, можно привести массу доводов в защиту того или иного языка, укзазать преимущества однго и недостатки другого, чем с упоением и занимаются многочисленные разжигатели религиозных войн в среде IT. Мы не ставим себе целью доказать преимущества K++, скорее показать преимущества всех языков, использующих альтернативный подход к программированию в целом. К чести того же C# можно сказать, что в третей версии были введены замыкания, по краткости не уступающие K++. В целом, у каждого языка есть свои преимущества и недостатки и в общем случае сравнивать их нельзя. Можно, разве что, судить о степени удобства языка, в сочетании с его производительностью и о том, насколько эффективно он позволяет решать задачи, на которые был рассчитан и исходя из которых проектировался.

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

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