Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Ruby: Общие вопросы > Сущность yield statement |
Автор: Andi 13.9.2006, 12:21 |
В Руби есть интересная языковая конструкция под названием yield statement.Обьясните на пальцах ее физический смысл. Хорошо бы ссылки (или коды программ) с конкретным применением. Кто что знает,отзовитесь! |
Автор: simanyay 13.9.2006, 17:48 | ||||||
Чисто-конкретное применение в Rails Есть основной шаблон (layout):
При помощи такого кода мы в разных вьюшках можем пихать в эти места разный код. Пример:
Таким образом на выходе будет:
Будет время, напишу примеры из голенького ruby. |
Автор: Pete 13.9.2006, 20:23 | ||||||
yield позволяет вызывать переданный методу блок кода:
результат:
Также можно вызывать блок с параметрами, передаваемыми при вызове yield:
«Свои методы с блоками» на http://ru.wikibooks.org/wiki/Ruby#.D0.A1.D0.B2.D0.BE.D0.B8_.D0.BC.D0.B5.D1.82.D0.BE.D0.B4.D1.8B_.D1.81_.D0.B1.D0.BB.D0.BE.D0.BA.D0.B0.D0.BC.D0.B8 |
Автор: max_lapshin 13.9.2006, 21:28 |
Тут идея в чем. Блоки — часть функционального программирования. Мы берем какую-то функциональность в виде объекта, но запускать ее будем только тогда, когда она нам будет нужна. Аналог — взять адрес функции в C, после чего запустить ее по необходимости. Тоже самое, только гораздо примитивнее. Соответственно, yield — полный аналог процедуры запуска функции не по ее прямому имени, а через переменную, в которую ее записали. Разница в том, что при запуске метода может быть передан блок. В описании метода он никак не фигурирует (впрочем, его можно задать явно), соответственно, yield — вызов того самого единственного блока, который был передан неявно в метод. |
Автор: Andi 14.9.2006, 08:21 |
Выходит что yield это анонимная рекурсия,правильно я понял? |
Автор: Pete 14.9.2006, 09:18 |
Не совсем. yield вызывает только ассоциированный с функцией блок кода. Функция не вызывает сама себя (в общем случае), она лишь обрабатывает некоторый код, переданный ей при вызове. |
Автор: skalex 14.9.2006, 15:45 |
Ребята, объясните попроще, а? ![]() |
Автор: Pete 14.9.2006, 20:20 | ||||
skalex, куда уж проще? ![]() Как правильно выразился max_lapshin, конструкцию yield можно понимать как тело некоторой функции, которая вызывается использованием ключевого слова yield. Примеры даны вполне очевидные. Добавлено @ 20:24 В моем последнем http://forum.vingrad.ru/index.php?showtopic=111720&view=findpost&p=853589:
фактически написано вот что:
|
Автор: max_lapshin 15.9.2006, 00:44 | ||
|
Автор: Void 15.9.2006, 07:59 |
Естественно. Куда ему return'аться с toplevel? А если бы блок с return был создан в контексте функции, то и возвращался бы из этой функции. Приведённый мной выше код отрабатывает, как предполагается, на 1.8.5. |
Автор: Andi 15.9.2006, 08:40 |
Примеры очень даже ничего. А еще говорят что Руби легок в понимании и освоении!!! !!!Это неправда!!! Да на уровне путсов и стрингов с аррэями все понятно. Но когда начинается высший пилотаж-тут уж извините! Надо больше примеров и притом с разьяснениями! Если кто то еще чего нибудь подкинет будет весьма интересно! |
Автор: max_lapshin 15.9.2006, 09:27 |
2Andi: говорят, что С++ легок в понимании. Это говорят люди, которые не видели шаблонов =) Концепция блоков вообще достаточно непростая, поэтому нельзя здесь хотеть примитивных решений. Примеров дохрена: открываем сырцы рельс и читаем. Если неясно, почему оно и как, открываем сырцы руби и смотрим. Я делаю так. |
Автор: Pete 15.9.2006, 23:00 |
Конечно, легок. На начальной стадии обучения. Только вряд ли на этой стадии нужен yield. Наличие сложных конструкций никак не уменьшает количество простых. |
Автор: Void 15.9.2006, 23:03 |
![]() ![]() |