Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Топ:
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Дисциплины:
2022-09-29 | 33 |
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!