Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Топ:
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Устройство и оснащение процедурного кабинета: Решающая роль в обеспечении правильного лечения пациентов отводится процедурной медсестре...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Интересное:
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
2022-09-29 | 29 |
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!