Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide / Программирование на Ruby 1.9 (3-е издание): Руководство прагматичного программиста: Ruby.New
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Метод может вызвать блок один или более раз используя выражение Ruby <i>yield</i>. Вы можете думать о <i>yield</i> как о чем то типа метода call который вызывает блок ассоциированный с методом содержащим <i>yield</i>. Droidos 08.11.10 в 19:22 |
|
|
Следующий пример пример показывает все это в действии. Мы определяем метод который вызывает yield дважды. За тем мы вызываем этот метод выводя блок на ту же линию после call (и после любых параметров метода). Некоторые люди любят думать о ассоциации блока с методом как о виде передачи параметров. Это работает на одном уровне но это не вся история. Вам будет луче думать о блоках и методах как о сопрограммах которые передают контроль и вперед между друг другом. Droidos 11.11.10 в 19:22 |
+1 | |
|
def call_block Droidos 23.09.10 в 20:16 |
||
|
выдаёт: aist 01.10.10 в 11:12 |
||
|
Start of method Droidos 23.09.10 в 20:21 |
||
|
Код в блоке (puts "In the block") выполняется дважды, по разу для каждого вызова yield. aist 01.10.10 в 11:12 |
||
|
Вы можете предоставить аргументы для вызова yield и они будут переданы в блок. В блоке вы составляете списки параметров для распознания этих аргументов между вертикальными барами (| параметры... |). Следующий пример показывает как метод вызывает ассоциированный с ним блок дважды передавая в блок два аргумента каждый раз: Droidos 11.11.10 в 19:54 |
||
|
<code> def who_says_what Droidos 19.09.10 в 19:53 |
||
|
выдаёт: aist 22.10.10 в 09:57 |
+1 | |
|
Dave says hello Droidos 23.09.10 в 20:21 |
||
|
Блоки кода используются посредством библиотеки Ruby для внедрения итераторов, которые являются методами, возвращающими соответствующие элементы из некоего набора данных, например, массива: aist 01.10.10 в 10:58 |
||
|
animals = %w( ant bee cat dog elk ) # create an array Droidos 23.09.10 в 20:20 |
||
|
выдаёт: aist 01.10.10 в 10:59 |
||
|
<code> ant Droidos 19.09.10 в 19:47 |
||
|
Многие из циклических конструкций, встроенных в языки типа С и Java, в Ruby реализованы в виде обычных вызовов методов, которые применяют связанный блок ноль или более раз: aist 01.10.10 в 11:02 |
||
|
<code> [ 'cat', 'dog', 'horse' ].each {|name| print name, " " } Droidos 19.09.10 в 19:45 |
||
|
Выводит: Droidos 11.11.10 в 19:15 |
||
|
<font face="verdana"> aist 01.10.10 в 10:43 |
||
|
Здесь мы вызываем блок для каждого элемента массива. Вот объект 5 вызывает блок 5 раз. Вместо использования циклов, в Ruby мы запрашиваем цифру 3 вызывать блок до тех пор, пока она не достигнет 6. И, наконец, для набора символов от а до е блок вызывается с использованием метода each. aist 01.10.10 в 11:09 |
||
|
<b>Чтение и Запись</b> aist 01.10.10 в 10:25 |
||
|
Ruby имеет полноценную библиотеку ввода-вывода. Однако, в большинстве примеров в этой книге, мы будем опираться на несколько простых методов. Мы уже применяли два метода, которые выводят информацию: puts пишет каждый аргумент с переводом строки после него; print также пишет аргументы, но без перевода строки. Оба могут писать в любой объект ввода-вывода, но по умолчанию пишут в стандартный вывод. aist 01.10.10 в 10:34 |
||
|
Другой метод, который мы часто используем это printf, который выводит переданные ему аргументы согласно строке формата (примерно как в С или Perl): aist 01.10.10 в 10:16 |
||
|
printf("Number: %5.2f,\nString: %s\n", 1.23, "hello") aist 01.10.10 в 10:14 |
||
|
выдаёт: aist 01.10.10 в 10:14 |
||
|
Number: 1.23, Droidos 23.09.10 в 20:35 |
||
|
В данном примере строка формата "Number: %5.2f,\nString: %s\n" говорит printf представить число с плавающей точкой (минимум 5 символов, с двумя после запятой) и строку. Заметьте, что переводы строки (\n) вписаны в строку, после каждого аргумента строка переводится. aist 01.10.10 в 10:38 |
||
|
Вы можете считывать входящие данные в свою программу многими способами. Возможно самый традиционный - использовать подпрограмму gets, которая выдаёт данные из входящего потока вашей программы построчно: aist 01.10.10 в 10:41 |
||
|
line = gets aist 01.10.10 в 10:42 |
||
|
print line aist 01.10.10 в 10:42 |
||
|
Так как gets возвращает nil при достижении конца входящих данных, вы можете использовать его в циклах с условием. Учтите, что в While условие является присвоением: мы помещаем выходные данные Gets в переменную line, а потом, перед тем как продолжить, проверяем выходное значение на nil или false: aist 01.10.10 в 10:21 |
||
|
while line = gets Droidos 23.09.10 в 20:35 |
||
|
<b>Параметры командной строки</b> aist 19.09.10 в 12:21 |
||
|
Когда вы запускаете программу на языке Ruby из командной строки, вы можете передать параметры. Это можно сделать двумя путями. aist 19.09.10 в 12:23 |
||
|
Во-первых, массив ARGV сдодержит все параметры, передаваемые запускаемой программе. Создайте файл cmd_line.rb со следующим содержимым: aist 19.09.10 в 12:26 |
||
|
puts "You gave #{ARGV.size} arguments" aist 19.09.10 в 12:26 |
||
|
p ARGV aist 19.09.10 в 12:27 |
||
|
Когда мы запустим этот файл с параметрами, мы сможем увидеть что они переданы: aist 19.09.10 в 12:30 |
||
|
$ ruby cmd_line.rb ant bee cat dog aist 19.09.10 в 12:28 |
||
|
выдаёт: aist 19.09.10 в 12:28 |
||
|
You gave 4 arguments aist 19.09.10 в 12:28 |
||
|
["ant", "bee", "cat", "dog"] aist 19.09.10 в 12:28 |
||
|
Часто параметрами программы являются имена файлов, которые вы хотите обработать. В этом случае можно использовать второй путь: переменную ARGF - специальный тип объекта ввода-вывода, который действует как содержимое всех перечисленных в командной строке файлов (или в стандартном вводе, если ничего не перечислено). Мы рассмотрим это дальше на стр. 342. aist 19.09.10 в 20:13 |
||
|
<b>Движемся дальше</b> Droidos 19.09.10 в 19:42 |
||
|
Вот и подошел к концу наш молниеносный тур по некоторым базовым возможностям Ruby. Мы рассмотрели объекты, методы, строки, контейнеры и регулярные выражения; некоторые простые управляющие структуры; некоторые довольно изящные итераторы. Надеемся, что этт раздел предоставил вам достаточно патронов, чтобы расправиться с оставшейся частью этой книги. Время двигаться вперед и вверх - к более высокому уровню. Далее мы рассмотрим классы и объекты - вещи, которые одновременно являются конструкциями высшего уровня в Ruby и существенными основами всего языка. aist 19.09.10 в 19:52 |
+1 |
