Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide / Программирование на Ruby 1.9 (3-е издание): Руководство прагматичного программиста: Ruby.New

← →
Английский оригинал Перевод на русский

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

Для большей информации о строках, так-же как и о других вводных стандартах Ruby смотрите главу 6 о котярах начинается на далекой 106 странице.

Droidos 20.10.10 в 17:34

0

Для большей информации о строках, а также о других стандартных типах Ruby, смотрите Главу 6, которая начинается на странице 106.

tartuff22 16.06.11 в 08:00

0

Наконец, мы могли бы упростить этот метод еще немного. Значение, возвращаемое методом Ruby является значением последнего вычисленного выражения, поэтому мы можем избавиться от временных переменных и возвращении выражения вообще:

Droidos 20.10.10 в 17:40

0

Наконец, мы могли бы упростить этот метод еще немного. Значение, возвращаемое методом Ruby является значением последнего вычисленного выражения, поэтому мы вообще можем избавиться от временной переменной и оператора return:

tartuff22 16.06.11 в 08:04

0

Наконец, мы могли бы упростить этот метод еще немного. Значение, возвращаемое методом Ruby является значением последнего вычисленного выражения, поэтому мы вообще можем избавиться от временной переменной и оператора return:

tartuff22 16.06.11 в 08:05

0

&nbsp;&nbsp;&nbsp;&nbsp;<code>def say_goodnight(name)</code>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>"Good night, #{name.capitalize}"</code>
&nbsp;&nbsp;&nbsp;&nbsp;<code>end</code>
&nbsp;&nbsp;&nbsp;&nbsp;<code>puts say_goodnight('ma')</code>

white_rabbit 19.09.10 в 11:20

0

Выводит

Droidos 25.10.10 в 13:16

0

&nbsp;&nbsp;&nbsp;&nbsp;<code>Good night, Ma</code>

white_rabbit 19.09.10 в 11:21

0

Мы обещали, что этот раздел будет кратким. У нас есть еще одна тема для обсуждения: Ruby имена. Для краткости мы будем использовать некоторые термины (например, переменная класса),те что мы не собираемся определять здесь.Однако, говорить о правилах сейчас, вы будете перед игрой, когда мы действительно приходят, чтобы обсудить переменных класса и, как позже.

Droidos 21.10.10 в 19:15

0

Мы обещали, что этот раздел будет кратким. Мы должны рассмотреть еще одну тему: Ruby names. Для краткости, будем использовать некоторые термины (такие как "переменная класса"), которые здесь не будут объясняться. Однако, говоря о правилах сейчас, вы будете во всеоружии, когда мы позже действительно подойдем к обсуждению переменных класса и т.п.

tartuff22 16.06.11 в 08:21

0

Ruby использует соглашения,которые могут показаться странными на первый взгляд: первые буквы названия указывают, на то как используется имя. Локальные переменные, параметры методов, и имена методов должны начинаться со строчной буквы или с символа подчеркивания. Глобальные переменные имеют префикс в виде знака доллара ($), и переменные экземпляра начинаются со знака коммерческого а (@). Переменные класса начинаются с двух знаков коммерческого а (@@) ( мы говорим глобальных и переменных класса лиш для полноты ,далее вы обнаружите что, они редко используются в программах Ruby. Существует много доказательств того, что глобальные переменные делают программы трудно поддерживаемыми. Переменные класса не так опасны, темнемение их не так часто используют.). Наконец, имена классов, имена модулей и констант должны начинаться с заглавной буквы. Образцы различных имен указаны в таблице 2.1 на следующей странице. После такого первоначального символа, в имя может быть включено любое сочетание букв, цифр и подчеркиваний (при условии, что символ, следующий за знаком @ не может быть цифрой). Однако, согласно правилам, составные переменные экземпляра, записываются с подчеркиванием между словами, и составные имена классов записываются в смешаном регистре ( каждое слово капитализируется). Имена методов могут заканчиваться символами : ?,!, и =.

Droidos 23.10.10 в 12:13

0

Ruby использует соглашение, которое сначала может показаться странным: первый символ имени показывает как имя используется. Локальные переменные, параметры методов и имена методов должны начинаться с маленькой буквы или с подчеркивания. Глобальные переменные начинаются с префикса ($), а переменные экземпляра с символа @ ("at"). Переменные класса начинаются с @@. (И хотя мы говорим здесь о глобальных переменных и переменных класса для полноты описания, вы увидите, что они редко используются в программах Ruby. Существует много доказательств того, что глобальные переменные делают программы сложными для поддержки. Переменные класса не так опасны - но их стараются не использовать.).
Наконец, имена классов, имена модулей и константы должны начинаться с заглавной буквы. Примеры различных имен даны в Таблице 2.1 на следующей странице. После первого символа имя может быть комбинацией букв, цифр и подчеркиваний (при условии, что символ, следующий за @, не может быть цифрой). Однако, по соглашению, имена переменных экземпляра, состоящие из нескольких слов, пишутся с подчеркиванием между словами, а составные имена классов пишутся в MixedCase-стиле (каждое слово с заглавной буквы).
Имя метода может заканчиваться символами "?", "!" и "=" .

tartuff22 16.06.11 в 08:57

1
+1

<b>Массивы и хеши</b>

white_rabbit 19.09.10 в 12:53

0

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

Droidos 23.10.10 в 12:34

0

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

tartuff22 16.06.11 в 09:16

0

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

Droidos 23.10.10 в 13:15

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;a = [ 1, 'cat', 3.14 ] # array with three elements
&nbsp;&nbsp;&nbsp;&nbsp;puts "The first element is #{a[0]}"
&nbsp;&nbsp;&nbsp;&nbsp;# set the third element
&nbsp;&nbsp;&nbsp;&nbsp;a[2] = nil
&nbsp;&nbsp;&nbsp;&nbsp;puts "The array is now #{a.inspect}"</code>

white_rabbit 19.09.10 в 11:21

0

выводит:

Droidos 23.10.10 в 13:53

0

The first element is 1

Droidos 27.10.10 в 17:33

0

The array is now [1, "cat", nil]

Droidos 23.10.10 в 14:57

0

Возможно, вы заметили, что мы использовали специальное значение nil в этом примере. Во многих языках, концепция nil (или null) означает "нет объекта". В Ruby, это не так; nil является объектом, как и любой другой,даже тот который ничего не представляет. Так или иначе, давайте вернемся к массивам и хэшам.

Droidos 23.10.10 в 15:00

0

Возможно, вы заметили, что мы использовали специальное значение nil в этом примере. Во многих языках, концепция nil (или null) означает "нет объекта". В Ruby, это не так; nil является объектом, как и любой другой, который, оказываетя, представляет "ничто" ('nothing'). Так или иначе, давайте вернемся к массивам и хэшам.

tartuff22 16.06.11 в 09:30

1

Возможно, вы заметили, что мы использовали специальное значение nil в этом примере. Во многих языках, концепция nil (или null) означает "нет объекта". В Ruby, это не так; nil является объектом, как и любой другой, который, оказываетя, представляет "ничто" ('nothing'). Так или иначе, давайте вернемся к массивам и хэшам.

tartuff22 16.06.11 в 09:30

0

Таблица 2.1. Примеры имен переменных и классов

Droidos 25.10.10 в 13:13

0

<table border="0" cellpadding="0" cellspacing="0" width="600px">
<tbody><tr><td colspan="4" width="80%">Variables </td><td rowspan="2" width="20%">Constants and Class Names</td></tr><tr><td>Local </td><td>Global </td><td>Instance </td><td>Class </td></tr><tr><td>name </td><td>$debug</td><td>@name</td><td>@@total</td><td>PI</td></tr><tr><td>fish_and_chips</td><td>$CUSTOMER</td><td>@point_1</td><td>@@symtab</td><td>FeetPerMile</td></tr><tr><td>x_axis</td><td>$_</td><td>@X</td><td>@@N</td><td>String</td></tr><tr><td>thx1138</td><td>$plan9</td><td>@_</td><td>@@x_pos</td><td>MyClass</td></tr><tr><td>_26</td><td>$Global</td><td>@plan9</td><td>@@SINGLE</td><td>JazzSong</td></tr></tbody></table>

white_rabbit 19.09.10 в 13:25

0

Синтаксис создания массивов со всеми кавычками и запятыми в некоторых случаях является слишком громоздким.

Droidos 23.10.10 в 15:02

0
+1

К счастью, в Ruby есть краткая форма: %w она делает то что нам надо:

Droidos 23.10.10 в 15:02

0
+2

<code>&nbsp;&nbsp;&nbsp;&nbsp;a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
&nbsp;&nbsp;&nbsp;&nbsp;a[0] # =&gt; "ant"
&nbsp;&nbsp;&nbsp;&nbsp;a[3] # =&gt; "dog"
&nbsp;&nbsp;&nbsp;&nbsp;# this is the same:
&nbsp;&nbsp;&nbsp;&nbsp;a = %w{ ant bee cat dog elk }
&nbsp;&nbsp;&nbsp;&nbsp;a[0] # =&gt; "ant"
&nbsp;&nbsp;&nbsp;&nbsp;a[3] # =&gt; "dog"</code>

white_rabbit 19.09.10 в 12:51

0

Хеши в Ruby сходны с массивами. Хеши используют литералы фигурных скобок а не квадратных скобок.

Droidos 23.10.10 в 15:09

1

Хеши в Ruby сходны с массивами. Литерал хэша использует фигурные скобки вместо квадратных скобок.

tartuff22 16.06.11 в 09:33

0

Литерал должен предоставить два объекта для каждого элемента: один для ключа, другой в качестве значения.

Droidos 23.10.10 в 15:10

1

Ключ и значение, как правило, разделяются с помощью =&gt;.

Droidos 23.10.10 в 15:11

0

К примеру, вы хотите соединить инструменты с их оркестральными секциями. Вы можете сделать это с помощью хеша:

Droidos 23.10.10 в 17:08

0

Например, вы можете отобразить музыкальные инструменты на их оркестровые разделы. Вы могли бы сделать это при помощи хеша:

tartuff22 16.06.11 в 09:47

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;inst_section = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cello' => 'string',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'clarinet' => 'woodwind',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'drum' => 'percussion',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'oboe' => 'woodwind',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'trumpet' => 'brass',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'trumpet' => 'brass',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'violin' => 'string'
&nbsp;&nbsp;&nbsp;&nbsp;}</code>

white_rabbit 19.09.10 в 14:40

0

То что слева от =&gt;; является ключом, а то что справа сообщаемым значением. Ключ в каждом хеше должен быть уникальным, вы не можете иметь две записи для "drum". Ключ и значение в хеше могут быть произвольными объектами, вы можете иметь хэши, где значениями являются массивы, другие хэши, и так далее.

Droidos 25.10.10 в 12:13

0

То, что слева от =>, является ключем, а то, что справа - соответствующим значением. Ключи в хеше должны быть уникальны - вы не можете иметь два вхождения для "drum". Ключи и значения в хеше могут быть произвольными объектами - у вас могут хеши, в которых значениями являются массивы, другие хеши и т.д.

tartuff22 16.06.11 в 10:07

1
+1

Хеши индексируются с использованием тех-же квадратных скобок как и массивы. В этом коде мы будем использовать метод р для вывода значений в консоль.Этот метод работает также как и puts, но выводит значения такие как ноль.

Droidos 25.10.10 в 13:21

0

Хеши индексируются с использованием тех же квадратных скобок как и массивы. В этом коде мы будем использовать метод р для вывода значений в консоль. Этот метод работает также как и puts, но явно выводит значения такие как nil.

tartuff22 16.06.11 в 10:11

0
+1

<code>&nbsp;&nbsp;&nbsp;&nbsp;p inst_section['oboe']
&nbsp;&nbsp;&nbsp;&nbsp;p inst_section['cello']
&nbsp;&nbsp;&nbsp;&nbsp;p inst_section['bassoon']</code>

Droidos 19.09.10 в 18:15

0

Выводит

Droidos 25.10.10 в 13:22

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;"woodwind"
&nbsp;&nbsp;&nbsp;&nbsp;"string"
&nbsp;&nbsp;&nbsp;&nbsp;nil</code>

Droidos 19.09.10 в 18:27

0

Как показано в предыдущем примере, если хэш индексируется с помощью отсутствующего ключа то он по умолчанию возвращает nil. Обычно это удобно по тому что nil обозначает<i>ложь</i> когда используются в условных выражениях. Иногда вам может понадобится сменить это значение по умолчанию. К примеру если вы используете хеш для того чтобы посчитать сколько раз каждое слово появляется в файле, удобно когда есть стандартное значение равное нулю. Также вы можете использовать слово как ключ, просто увеличивая сообщаемое значение хеша и не беспокоясь видели ли вы это слово до этого. Это легко сделать задавая стандартное значение когда вы создаете новый пустой хеш.(Полный код считателя периодичности слов находится на странице 72.)

Droidos 28.10.10 в 09:28

0

Как показано в предыдущем примере, хеш по умолчанию возвращает nil при попытке получить значение по ключу, которого в хеше нет. Обычно это удобно, потому что nil означает false, когда используется в условных выражениях. Иногда вы можете захотеть изменить это значение по умолчанию. Например, если вы используете хеш, чтобы подсчитать, сколько раз каждое слово встречается в файле, удобно иметь значение по умолчанию 0. Тогда вы можете использовать слово как ключ и просто увеличивать соответствующее хеш-значение не беспокоясь о том, видели ли вы это слово до этого. Это легко можно сделать определяя значение по умолчанию при создании нового, пустого хеша. (Полный листинг "счетчика" на странице 72.)

tartuff22 16.06.11 в 11:50

0
+1

<code>&nbsp;&nbsp;&nbsp;&nbsp;histogram = Hash.new(0) # The default value is zero
&nbsp;&nbsp;&nbsp;&nbsp;histogram['ruby'] # =&gt; 0
&nbsp;&nbsp;&nbsp;&nbsp;histogram['ruby'] = histogram['ruby'] + 1
&nbsp;&nbsp;&nbsp;&nbsp;histogram['ruby'] # =&gt; 1</code>

Droidos 19.09.10 в 18:16

0

У объектов массивов и хешей есть множество полезных методов; смотрите обсуждение на странице 67, и опорные секции начинающиеся на страницах 447 и 533 для деталей.

Droidos 28.10.10 в 18:18

0
+1

<b>Символы</b>

Droidos 26.10.10 в 13:57

0

Часто при программировании необходимо придумывать название для чего-то важного. Например, вы захотели обратиться к точкам на компасе по имени, поэтому написали следующее:

aist 19.09.10 в 12:35

1

<code>&nbsp;&nbsp;&nbsp;&nbsp;NORTH = 1
&nbsp;&nbsp;&nbsp;&nbsp;EAST = 2
&nbsp;&nbsp;&nbsp;&nbsp;SOUTH = 3
&nbsp;&nbsp;&nbsp;&nbsp;WEST = 4</code>

aist 19.09.10 в 12:36

1

Теперь вы можете использовать в своей программе эти константы, а не числа:

aist 19.09.10 в 12:37

1

<code>&nbsp;&nbsp;&nbsp;&nbsp;walk(NORTH)
&nbsp;&nbsp;&nbsp;&nbsp;look(EAST)</code>

aist 19.09.10 в 12:38

1

Большую часть времени, текущие числовые значения этих констант не имеют значения(пока они уникальны). Все что вам нужно это различать эти четыре направления.

Droidos 28.10.10 в 18:39

0

Ruby предлагает ясную альтернативу. Символы являются просто именами констант которые вы не должны предварительно объявлять и которые гарантировано будут уникальны.

Droidos 28.10.10 в 18:47

0

Символьный литерал начинается с двоеточия и обычно сопровождается некоторым именем.

tartuff22 16.06.11 в 12:03

0

Ruby предлагает более чистую альтернативу. Идентификаторы являются просто именами констант, которые вы не должны объявлять заранее и которые гарантированно уникальны. Литерал идентификатора начинается с двоеточия и обычно сопровождается некоторым именем.

tartuff22 16.06.11 в 12:23

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;walk(:north)
&nbsp;&nbsp;&nbsp;&nbsp;look(:east)</code>

Droidos 19.09.10 в 21:37

0

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

Droidos 26.10.10 в 14:23

0

Нет необходимости присваивать значение идентификатору - Ruby позаботится об этом. Ruby также гарантирует, что независимо от того, где идентификатор появляется в вашей программе, его значение будет тем же самым. Т.е., вы можете написать следующее:

tartuff22 16.06.11 в 12:18

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;def walk(direction)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if direction == :north
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ...
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
</code>

Droidos 23.09.10 в 20:12

0

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

Droidos 26.10.10 в 14:23

0
+1

<code>&nbsp;&nbsp;&nbsp;&nbsp;inst_section = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:cello =&gt; 'string',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:clarinet =&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'woodwind',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:drum =&gt; 'percussion',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:oboe =&gt; 'woodwind',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:trumpet =&gt; 'brass',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:violin =&gt; 'string'
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;inst_section[:oboe] # =&gt; "woodwind"
&nbsp;&nbsp;&nbsp;&nbsp;inst_section[:cello] # =&gt; "string"
&nbsp;&nbsp;&nbsp;&nbsp;# Note that strings aren't the same as symbols...
&nbsp;&nbsp;&nbsp;&nbsp;inst_section['cello'] # =&gt; nil
</code>

Droidos 23.09.10 в 20:11

0

Фактически, символы на столько часто использовались как ключи хешей что Ruby 1.9 представляет новый синтаксис - вы можете использовать имя: пары значений для создания хеша 1.9 если ключи являются символами:

Droidos 29.10.10 в 17:09

0

Фактически, идентификаторы так часто использовались как хеш-ключи, что Ruby 1.9 вводит новый синтаксис - вы можете использовать пары "имя: значение" чтобы создать хеш 1.9, если ключи являются идентификаторами.

tartuff22 16.06.11 в 12:31

0

<code>&nbsp;&nbsp;&nbsp;&nbsp;inst_section = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cello: 'string',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clarinet: 'woodwind',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drum: 'percussion',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oboe: 'woodwind',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trumpet: 'brass',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;violin: 'string'
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;puts "An oboe is a #{inst_section[:oboe]}"</code>

Droidos 23.09.10 в 20:26

0

Выводит:

Droidos 26.10.10 в 14:26

0

An oboe is a woodwind

Droidos 29.10.10 в 17:37

0

<b>Управляющие структуры</b>

Droidos 29.10.10 в 16:59

0
Минутку...

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

Следующая страница →