Работа с выдачей, процедурами и блоками — КиберПедия 

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Работа с выдачей, процедурами и блоками

2022-09-29 29
Работа с выдачей, процедурами и блоками 0.00 из 5.00 0 оценок
Заказать работу

Именованные методы обычно являются ядром приложения, но иногда вам захочется иметь возможность более гибкого манипулирования логикой программы. Процедуры позволяют поместить логику, включая методы, внутрь схожих с переменными структур, которые можно пропускать сквозь вашу программу и вызывать напрямую или через ключевое слово "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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.