Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Топ:
Марксистская теория происхождения государства: По мнению Маркса и Энгельса, в основе развития общества, происходящих в нем изменений лежит...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Дисциплины:
2022-09-29 | 30 |
5.00
из
|
Заказать работу |
|
|
Именованные методы обычно являются ядром приложения, но иногда вам захочется иметь возможность более гибкого манипулирования логикой программы. Процедуры позволяют поместить логику, включая методы, внутрь схожих с переменными структур, которые можно пропускать сквозь вашу программу и вызывать напрямую или через ключевое слово "yield" (выдача). Подобно методам, процедуры (Procs) могут принимать аргументы и возвращать значения.
Это хлеб с маслом для Руби-кодера, но если вы не знаете Ruby, то
сначала эти факты могут слегка сконфузить. Для незнакомых с языком
Ruby естественным путем к усвоению темы "Using Procs" может стать
более пристальная фокусировка на таких вещах в начале углубленного изучения Кристалла.
Блоки позволяют повторно использовать код без помощи формальных методов, как только вы разберетесь, как же работает синтаксис. (Вам
уже случалось применять их, но они имеют ряд дополнительных возможностей.) Вы можете сгруппировать одну или несколько строчек программного кода в блок кода, охватив их фигурными скобками {}
или поместив между инструкциями "do" и "end". Они не являются методами, но тоже снабжены именами для обеспечения возможности указания и вызова.
Как и в Ruby, эти кодовые блоки можно также использовать в качестве параметров при вызове метода. Например, метод по имени "testing" вы можете вызвать с помощью кодового блока:
testing do
puts "in code block"
end
Если вы создали метод с точно таким же именем, yield будет вызывать тот самый блок кода:
def testing
puts "at top of method"
yield
puts "back inside method"
yield
puts "at end of method"
end
# => # at top of method
# in code block
|
# back inside method
# in code block
# at end of method
Когда вы вызываете эти блоки с помощью "yield", компилятор Crystal всегда помещает их в строки — из соображений производительности. Они не вызывают переход к отдельной функции во время выполнения программного кода. Можно использовать блоки для удобочитаемости
или повторного использования кода, что не окажет негативного
влияния на производительность. Этот механизм может пригодиться, например, если вы захотите провести итерацию коллекции или предоставить особый пользовательский алгоритм.
Ключевое слово yield действует как вызов метода, так что вы можете передать ему один или несколько параметров, просто добавив их в блок
do как "do |n|", вот так:
methods_and_procs/procs.cr
def testing
puts "at top of method"
yield 1
puts "back inside method"
yield 2
puts "at end of method"
end
testing do |n|
puts "in code block #{n}"
end
# => # at top of method
# in code block 1
# back inside method
# in code block 2
# at end of method
Вы можете использовать break внутри блока, чтобы раньше выйти из метода; ключевое слово next выполняет преждевременный выход из блока, но не из метода. Является ли блок кода тоже объектом? Тех-нически, это неверно. Но вы можете захватить блок, если напишете
что-то вроде "def testing(&block)".
Это приведет к созданию процедурного объекта "Proc" для блока (который вы определили ранее как "testing do..."), который был передан. Это позволяет рассматривать его как обычный объект и включать в аргументы или возвращаемые значения. Но только вместо "yield" необходимо вызывать метод Proc. В этом случае вам следует исполь-
зовать "block.call".
methods_and_procs/procs.cr
def testing(&block)
puts "at top of method"
block.call
puts "back inside method"
block.call
puts "at end of method"
end
testing do
puts "in code block"
end
# => # at top of method
# in code block
# back inside method
# in code block
# at end of method
Если код, который требуется выполнить внутри блока кода, является кратким, вы можете предпочесть запись блока с помощью {}. Это приближает логику кодового блока к точке вызова и облегчает напи-
сание краткого и удобочитаемого кода для повторяющихся логических конструкций.
|
methods_and_procs/procs.cr
langs = %w[Java Go Crystal]
langs.map { |lang| lang.upcase } # => ["JAVA", "GO", "CRYSTAL"]
Этот блок имеет только один аргумент с единственным методом, включенным в него. В таком случае Crystal позволяет вам применить немного чудесного синтаксического сахара (в отличие от Ruby). В следующем примере метод map применяется к каждой строке в langs, повышая регистр буквенных символов. Обе линии вывода демонстри-
руют один и тот же результат. Вы можете видеть, что синтаксис блока
и переменной замещен оператором "&".
methods_and_procs/procs.cr
langs = %w[Java Go Crystal]
langs.map { |lang| lang.upcase } # => ["JAVA", "GO", "CRYSTAL"]
langs.map &.upcase # => ["JAVA", "GO", "CRYSTAL"]
Метод так же успешно может сыграть роль оператора, и он также
может принимать аргументы, таким вот образом:
methods_and_procs/procs.cr
nums = [42, 43, 44]
nums.map { |num| num + 2 } # (1) => [44, 45, 46]
nums.map &.+(2) # (2) => [44, 45, 46]
Аналогичным образом вы можете еще и скреплять методы (см. раздел §"Сцепливание методов").
|
|
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!