Smalltalk в примерах/Управляющие структуры: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
 
Строка 1:
Современные языки программирования предоставляют способы для выполнения кода условно и для повторения блоков кода. В C, есть \verb|if () {},| \verb|if () {} else {},| \verb|do {} while (),| \verb|while () {},| и \verb|for (;;) {}|. КонструкцыиКонструкции такого типа обычно являются частью языка.
 
<!--
Строка 5:
-->
 
 
Однако в СмолтокSmalltalk сам не содержытсодержит эти конструкцыиконструкции. Вместо этого они создаются путём посылки сообщений объектам. В результатом чего появляется возможность изменять работу управляющих сообщений если тебя не устраивает способ их работы (не рекомендуется!). Если тебе нужна новая управляющая структура, ты можэшможешь написать её. Например, в СмолтокеSmalltalk нет сообщения переключатель/случай, таким образом если ты думаешдумаешь, что оно тебе нужно, ты можэшможешь написать его (опять жэже этого не рекомендуется делать по причинам, изложэннымизложенным в Главе ---, ---). Фактически, ты вероятно не нуждаешсянуждаешься в управляющих структурах, отличных от присутствующих в стандартной библиотеке СмолтокаSmalltalk. Давай рассмотрим эти структуры.
 
 
<!--
Строка 13 ⟶ 15 :
==Условное выполнение==
 
Простейшей из условных структур является выполнение блока кода если некоторое условие истинно (или ложно). В СмолтокSmalltalk есть два сообщения: одно когда условие истинно и одно когда оно ложно. Оба сообщения посылаются экземпляру класса \emph{Логический} (т.е. \emph{истина} или \emph{ложь}). Есть два основных подхода---
<!--
The simplest type of conditional execution is to only execute a particular block of code if some condition is true (or false). In Smalltalk, there are two messages, one for when the condition is true and one for when it's false. Both messages are sent to an instance of Boolean (ie, to true or false). Here is the general approach, with an example.
Строка 43 ⟶ 45 :
ложь?: [Транскрипт пс; показать: 'Ложь'].
 
СмолтокSmalltalk не предоставляет простой конструкции, аналогичной Cшной \verb|if () {}| \verb|else if () {}| \verb|else {}|. Но можно это сделать это при помощи вложенний:
 
<!--
Строка 66 ⟶ 68 :
==Циклы==
 
В СмолтокеSmalltalk нет циклов. Вместо этого он предоставляет эту возможность путём посылки сообщений БлокамКода. Наиболее общий тип цикла это когда цикл продолжается пока некоторое условие истинно. Так долго как значение блока (т.е. последнее предложение в блоке) \emph{истинно}, цикл будет продолжаться. Этот тип цикла подобен цыклуциклу \verb|do {} while ();| в C. Далее показан синтаксис таковатакого цикла и пример.
 
<!--
Строка 78 ⟶ 80 :
счётчик < 10 ] покаИстинен.
 
Условие можэтможет быть противоположным так что блок будет выполняться пока его значение \emph{ложно}.
 
<!--
Строка 85 ⟶ 87 :
[некоторый код] покаЛож.
 
Следующий цыклцикл подобен предыдущему, но если первый блок истинен второй блок выполняется. Этот тип цыклацикла отчасти похож на цыклцикл \verb|while () {}| языка C но он более универсальный, потому что он допускает много предложэнийпредложений в первом блоке. Опять рассмотрим синтаксис таковатакого цыклацикла и пример.
 
<!--
Строка 98 ⟶ 100 :
[Транскрипт: пс; показать: 'Продолжаю']
 
Как и в предыдущем цыклецикле ты можэшможешь обратить условие при котором цыклцикл продолжается.
 
<!--
Строка 104 ⟶ 106 :
-->
[некоторый код]
покаЛожен:
покаЛожэн:
[следующйследующий код]
 
Последний непосредственный механизм цыклацикла это просто повторение. Это означает что код в блоке должэндолжен заканчивать выполнение метода, или что-либо останавливает выполнение иначе ты получишполучишь бесконечный цыклцикл.
 
<!--
Строка 114 ⟶ 116 :
[некоторый код] повторять.
 
[(Диалог подтвердить: 'ПродолжэниеПродолжение') ложложь?: [^сам].
Транскрипт пс; показать: 'Продолжаю'] повторять.
 
==Повторения==
 
В СмолтокеSmalltalk есть три способа повторить блок заданное количество раз. Два из них используют индэксиндекс, а в оставшэмсяоставшемся принимается что ты не беспокоишсябеспокоишься о номере итерацыиитерации. Если в цыклецикле не имеет значения значение индэксаиндекса, простейшымпростейшим способом будет послать сообщение \verb|разПовторить:| с блоком в виде параметра. Например:
 
<!--
Строка 126 ⟶ 128 :
5 разПовторить: [Транскрипт: пс; показать: 'привет'].
 
Если в цыклецикле надо знать номер итерацыиитерации, ты должэндолжен послать одно из следующих двух сообщений. Если тебе нужэннужен цыклцикл от однавоодного числа до друговадругого, с единичным шагом, пошли сообщение \verb|до:делать:| с параметром в виде блока. Блок ожидает получения одного параметра --- индэксаиндекса. Например,
 
<!--
Строка 132 ⟶ 134 :
-->
1 до: 5 делать:
[ :индэксиндекс | Транскрипт пс; показать: индэксиндекс строкаДляПечати ].
 
Если тебе нужэннужен цыклцикл подобный данному но тебе надо изменять индэксиндекс на единицу, ты можэшможешь определить значение шага с помощью сообщения \verb|до:шаг:делать:|. Опять это сообщение ожыдаетожидает блок и он должэндолжен ожыдатьожидать получения индэксаиндекса. Например,
 
<!--
Строка 140 ⟶ 142 :
-->
15 до: 1 шаг: -2 делать:
[ :индэксиндекс | Транскрипт пс; показать: индэксиндекс строкаДляПечати ].
 
Вопреки существованию этих сообщений, они менее полезны чем ты можэшможешь предположытьпредположить. Наиболее часто используемые цыклыциклы выполняются для совокупности объектов, и совокупности имеют мощные механизмы для выполнения цыкловциклов. Мы поговорим подробнее о цыклахциклах для совокупностей в Главе \potom, \potom.
 
<!--
Строка 150 ⟶ 152 :
==Оптимизированные сообщения==
 
БлокиКода используются в вышэперечисленныхвышеперечисленных управляющих структурах как параметры, и иногда как получатели сообщений. БлокКода можэтможет быть помещён в переменную или можэтможет быть записан как литерал --- т.е. как код заключённый в квадратные скобки.
 
<!--
Строка 157 ⟶ 159 :
-->
 
 
Если все БлокиКода участвующие в сообщениях это литеральные блоки, сообщение компилируется как подстановка т.е. посылка сообщения не используется. С другой стороны, если любой БлокКода участвующий в сообщении как переменная а не литерал, код не будет скомпилирован как подстановка и будет производиться посылка сообщения. Обычно эти сообщения компилируются как подстановка ибо большынствобольшинство блоков являются литеральными.
 
<!--