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

0

Следующий пример пример показывает все это в действии. Мы определяем метод который вызывает yield дважды. За тем мы вызываем этот метод выводя блок на ту же линию после call (и после любых параметров метода). Некоторые люди любят думать о ассоциации блока с методом как о виде передачи параметров. Это работает на одном уровне но это не вся история. Вам будет луче думать о блоках и методах как о сопрограммах которые передают контроль и вперед между друг другом.

Droidos 11.11.10 в 19:22

0
+1

def call_block
puts "Start of method"
yield
yield
puts "End of method"
end
call_block { puts "In the block" }

Droidos 23.09.10 в 20:16

0

выдаёт:

aist 01.10.10 в 11:12

1

Start of method
In the block
In the block
End of method

Droidos 23.09.10 в 20:21

0

Код в блоке (puts "In the block") выполняется дважды, по разу для каждого вызова yield.

aist 01.10.10 в 11:12

1

Вы можете предоставить аргументы для вызова yield и они будут переданы в блок. В блоке вы составляете списки параметров для распознания этих аргументов между вертикальными барами (| параметры... |). Следующий пример показывает как метод вызывает ассоциированный с ним блок дважды передавая в блок два аргумента каждый раз:

Droidos 11.11.10 в 19:54

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;def who_says_what
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield("Dave", "hello")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield("Andy", "goodbye")
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;who_says_what {|person, phrase| puts "#{person} says #{phrase}"}</code>

Droidos 19.09.10 в 19:53

0

выдаёт:

aist 22.10.10 в 09:57

0
+1

Dave says hello
Andy says goodbye

Droidos 23.09.10 в 20:21

0

Блоки кода используются посредством библиотеки Ruby для внедрения итераторов, которые являются методами, возвращающими соответствующие элементы из некоего набора данных, например, массива:

aist 01.10.10 в 10:58

1

animals = %w( ant bee cat dog elk ) # create an array
animals.each {|animal| puts animal } # iterate over the contents

Droidos 23.09.10 в 20:20

0

выдаёт:

aist 01.10.10 в 10:59

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;ant
&nbsp;&nbsp;&nbsp;&nbsp;bee
&nbsp;&nbsp;&nbsp;&nbsp;cat
&nbsp;&nbsp;&nbsp;&nbsp;dog
&nbsp;&nbsp;&nbsp;&nbsp;elk</code>

Droidos 19.09.10 в 19:47

0

Многие из циклических конструкций, встроенных в языки типа С и Java, в Ruby реализованы в виде обычных вызовов методов, которые применяют связанный блок ноль или более раз:

aist 01.10.10 в 11:02

1

<code>&nbsp;&nbsp;&nbsp;&nbsp;[ 'cat', 'dog', 'horse' ].each {|name| print name, " " }
&nbsp;&nbsp;&nbsp;&nbsp;5.times { print "*" }
&nbsp;&nbsp;&nbsp;&nbsp;3.upto(6) {|i| print i }
&nbsp;&nbsp;&nbsp;&nbsp;('a'..'e').each {|char| print char }</code>

Droidos 19.09.10 в 19:45

0

Выводит:

Droidos 11.11.10 в 19:15

0

<font face="verdana">
<table><tbody><tr><td>cat</td><td>dog</td><td>horse</td><td>&nbsp;</td><td>&nbsp;</td></tr><tr><td>*</td><td>*</td><td>*</td><td>*</td><td>*</td></tr><tr><td>3</td><td>4</td><td>5</td><td>6</td><td>&nbsp;</td></tr><tr><td>a</td><td>b</td><td>c</td><td>d</td><td>e</td></tr></tbody></table></font>

aist 01.10.10 в 10:43

1

Здесь мы вызываем блок для каждого элемента массива. Вот объект 5 вызывает блок 5 раз. Вместо использования циклов, в Ruby мы запрашиваем цифру 3 вызывать блок до тех пор, пока она не достигнет 6. И, наконец, для набора символов от а до е блок вызывается с использованием метода each.

aist 01.10.10 в 11:09

1

<b>Чтение и Запись</b>

aist 01.10.10 в 10:25

1

Ruby имеет полноценную библиотеку ввода-вывода. Однако, в большинстве примеров в этой книге, мы будем опираться на несколько простых методов. Мы уже применяли два метода, которые выводят информацию: puts пишет каждый аргумент с переводом строки после него; print также пишет аргументы, но без перевода строки. Оба могут писать в любой объект ввода-вывода, но по умолчанию пишут в стандартный вывод.

aist 01.10.10 в 10:34

1

Другой метод, который мы часто используем это printf, который выводит переданные ему аргументы согласно строке формата (примерно как в С или Perl):

aist 01.10.10 в 10:16

1

printf("Number: %5.2f,\nString: %s\n", 1.23, "hello")

aist 01.10.10 в 10:14

1

выдаёт:

aist 01.10.10 в 10:14

1

Number: 1.23,
String: hello

Droidos 23.09.10 в 20:35

0

В данном примере строка формата "Number: %5.2f,\nString: %s\n" говорит printf представить число с плавающей точкой (минимум 5 символов, с двумя после запятой) и строку. Заметьте, что переводы строки (\n) вписаны в строку, после каждого аргумента строка переводится.

aist 01.10.10 в 10:38

1

Вы можете считывать входящие данные в свою программу многими способами. Возможно самый традиционный - использовать подпрограмму gets, которая выдаёт данные из входящего потока вашей программы построчно:

aist 01.10.10 в 10:41

0

line = gets

aist 01.10.10 в 10:42

1

print line

aist 01.10.10 в 10:42

1

Так как gets возвращает nil при достижении конца входящих данных, вы можете использовать его в циклах с условием. Учтите, что в While условие является присвоением: мы помещаем выходные данные Gets в переменную line, а потом, перед тем как продолжить, проверяем выходное значение на nil или false:

aist 01.10.10 в 10:21

1

while line = gets
print line
end

Droidos 23.09.10 в 20:35

0

<b>Параметры командной строки</b>

aist 19.09.10 в 12:21

1

Когда вы запускаете программу на языке Ruby из командной строки, вы можете передать параметры. Это можно сделать двумя путями.

aist 19.09.10 в 12:23

1

Во-первых, массив ARGV сдодержит все параметры, передаваемые запускаемой программе. Создайте файл cmd_line.rb со следующим содержимым:

aist 19.09.10 в 12:26

1

puts "You gave #{ARGV.size} arguments"

aist 19.09.10 в 12:26

1

p ARGV

aist 19.09.10 в 12:27

1

Когда мы запустим этот файл с параметрами, мы сможем увидеть что они переданы:

aist 19.09.10 в 12:30

1

$ ruby cmd_line.rb ant bee cat dog

aist 19.09.10 в 12:28

1

выдаёт:

aist 19.09.10 в 12:28

1

You gave 4 arguments

aist 19.09.10 в 12:28

1

["ant", "bee", "cat", "dog"]

aist 19.09.10 в 12:28

1

Часто параметрами программы являются имена файлов, которые вы хотите обработать. В этом случае можно использовать второй путь: переменную ARGF - специальный тип объекта ввода-вывода, который действует как содержимое всех перечисленных в командной строке файлов (или в стандартном вводе, если ничего не перечислено). Мы рассмотрим это дальше на стр. 342.

aist 19.09.10 в 20:13

1

<b>Движемся дальше</b>

Droidos 19.09.10 в 19:42

0

Вот и подошел к концу наш молниеносный тур по некоторым базовым возможностям Ruby. Мы рассмотрели объекты, методы, строки, контейнеры и регулярные выражения; некоторые простые управляющие структуры; некоторые довольно изящные итераторы. Надеемся, что этт раздел предоставил вам достаточно патронов, чтобы расправиться с оставшейся частью этой книги. Время двигаться вперед и вверх - к более высокому уровню. Далее мы рассмотрим классы и объекты - вещи, которые одновременно являются конструкциями высшего уровня в Ruby и существенными основами всего языка.

aist 19.09.10 в 19:52

2
+1
Минутку...

← Предыдущая страница