|
|
|
Andi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
В Руби есть интересная языковая конструкция под названием
yield statement.Обьясните на пальцах ее физический смысл. Хорошо бы ссылки (или коды программ) с конкретным применением. Кто что знает,отзовитесь! |
|||
|
||||
simanyay |
|
||||||
Антон Ковалёв Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 6 Всего: 36 |
Чисто-конкретное применение в Rails
Есть основной шаблон (layout):
При помощи такого кода мы в разных вьюшках можем пихать в эти места разный код. Пример:
Таким образом на выходе будет:
Будет время, напишу примеры из голенького ruby. -------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
||||||
|
|||||||
Pete |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: 2 Всего: 12 |
yield позволяет вызывать переданный методу блок кода:
результат:
Также можно вызывать блок с параметрами, передаваемыми при вызове yield:
«Свои методы с блоками» на wikibooks Это сообщение отредактировал(а) Pete - 13.9.2006, 20:29 -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
||||||
|
|||||||
max_lapshin |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2006 Где: Москва Репутация: 2 Всего: 3 |
Тут идея в чем. Блоки — часть функционального программирования.
Мы берем какую-то функциональность в виде объекта, но запускать ее будем только тогда, когда она нам будет нужна. Аналог — взять адрес функции в C, после чего запустить ее по необходимости. Тоже самое, только гораздо примитивнее. Соответственно, yield — полный аналог процедуры запуска функции не по ее прямому имени, а через переменную, в которую ее записали. Разница в том, что при запуске метода может быть передан блок. В описании метода он никак не фигурирует (впрочем, его можно задать явно), соответственно, yield — вызов того самого единственного блока, который был передан неявно в метод. |
|||
|
||||
Andi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
Выходит что yield это анонимная рекурсия,правильно я понял?
|
|||
|
||||
Pete |
|
|||
Опытный Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: 2 Всего: 12 |
Не совсем. yield вызывает только ассоциированный с функцией блок кода. Функция не вызывает сама себя (в общем случае), она лишь обрабатывает некоторый код, переданный ей при вызове.
-------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
skalex |
|
|||
Хороший человек Профиль Группа: Участник Клуба Сообщений: 895 Регистрация: 2.4.2004 Репутация: 5 Всего: 23 |
Ребята, объясните попроще, а?
|
|||
|
||||
Pete |
|
||||
Опытный Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: 2 Всего: 12 |
skalex, куда уж проще?
Как правильно выразился max_lapshin, конструкцию yield можно понимать как тело некоторой функции, которая вызывается использованием ключевого слова yield. Примеры даны вполне очевидные. Добавлено @ 20:24 В моем последнем примере:
фактически написано вот что:
Это сообщение отредактировал(а) Pete - 14.9.2006, 20:24 -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
||||
|
|||||
Void |
|
||||
λcat.lolcat Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
Не совсем. yield и блоки — это скорее ближе к сопроцедурам. Есть одно весьма существенное отличие от функций высшего порядка: из блоков Ruby возможен нелокальный возврат. Вызывая функцию, мы можем быть уверены, что она вернёт нам управление. Даже если будет выброшено исключение, мы будем иметь возможность перехватить его. Блок же может передать управление в контекст, в котором он был создан. Например:
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
max_lapshin |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2006 Где: Москва Репутация: 2 Всего: 3 |
|
|||
|
||||
Void |
|
|||
λcat.lolcat Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
Естественно. Куда ему return'аться с toplevel? А если бы блок с return был создан в контексте функции, то и возвращался бы из этой функции. Приведённый мной выше код отрабатывает, как предполагается, на 1.8.5. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Andi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 28.8.2006 Репутация: нет Всего: нет |
Примеры очень даже ничего.
А еще говорят что Руби легок в понимании и освоении!!! !!!Это неправда!!! Да на уровне путсов и стрингов с аррэями все понятно. Но когда начинается высший пилотаж-тут уж извините! Надо больше примеров и притом с разьяснениями! Если кто то еще чего нибудь подкинет будет весьма интересно! Это сообщение отредактировал(а) Andi - 15.9.2006, 08:41 |
|||
|
||||
max_lapshin |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2006 Где: Москва Репутация: 2 Всего: 3 |
2Andi: говорят, что С++ легок в понимании. Это говорят люди, которые не видели шаблонов =)
Концепция блоков вообще достаточно непростая, поэтому нельзя здесь хотеть примитивных решений. Примеров дохрена: открываем сырцы рельс и читаем. Если неясно, почему оно и как, открываем сырцы руби и смотрим. Я делаю так. |
|||
|
||||
Pete |
|
|||
Опытный Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: 2 Всего: 12 |
Конечно, легок. На начальной стадии обучения. Только вряд ли на этой стадии нужен yield. Наличие сложных конструкций никак не уменьшает количество простых. -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
Void |
|
|||
λcat.lolcat Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
Кто? Мне такие безумцы ещё не встречались -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Правила форума "Ruby: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |