
Ruby → User Guide #28 - Ruby - Фишки
Ruby, ruby lesson, ruby уроки, user guide, руководство пользователя
Эта глава посвящена некоторым практическим приемам.
Разделители выражений
В некоторых языках необходимо соблюдение некоторых правил пунктуации; часто используется точка с запятой (
;
), для обозначения окончания выражения в программе. Ruby вместо этого следует соглашениям, используемым в шеллах, таких как
sh
или
csh
. Множественные выражения в одной строке должны разделяться точкой с запятой, но это не обязательно в конце строки; перевод строки трактуется как точка с запятой. Если линия заканчивается обратным слэшем (
\
), перевод строки игнорируется; это позволяет разнести длинный оператор на несколько строк.
Комментарии
Зачем писать комментарии? Хотя хорошо написанный код имеет тенденцию к самодокументированию, часто бывает полезно делать заметки на полях; будет ошибкой думать, что другие смогут немедленно сказать что делает Ваш код лишь мельком взглянув на него (как это можете Вы). Кроме того, вы можете оказаться в роли этого другого человека всего лишь несколько дней спустя; кто из нас не возвращался спустя некоторое время к старой программе чтобы что-то дописать или исправить ее и не говорил "Я знаю, что это писал я. Но, черт побери, что вот это значит?"
Некоторые опытные программисты достаточно правильно заметят, что противоречивые и устаревшие комментарии могут быть хуже, чем их отсутствие. Безусловно, комментарии не могут быть заменой для читабельного кода; если Ваш код неясен, вероятно, он также содержит ошибки. Может оказаться, что, пока Вы изучаете Ruby, Вы больше испытываете нужду в комментариях, а затем все меньше и меньше, по мере того, как Вы учитесь все лучше выражать свои идеи с помощью простого, элегантного, читабельного кода.

Ruby → User Guide #27 - Ruby - Инициализация объектов
Ruby, ruby lesson, ruby уроки, user guide, руководство пользователя
В нашем классе Fruit из предыдущей главы есть @-переменные: первая описывает вид фрукта, вторая - его состояние. Только после написания своего специализированного метода
inspect
для этого класса, мы осознали, что для любого фрукта отсутствие заданных характеристик бессмысленно. К счастью, в Ruby есть способ гарантировать, что @-переменные всегда будут инициализированы.
Метод
initialize
Когда Ruby создает новый объект, он ищет в описании класса метод
initialize
и вызывает его. Таким образов, простая вещь, которую мы можем проделать,- это использовать
initialize
для задания всем @-переменным значений "по-умолчанию", так что теперь "методу
inspect
всегда есть что сказать". ;-)
ruby> class Fruit | def initialize | @kind = "apple" | @condition = "ripe" | end | end nil ruby> f4 = Fruit.new "a ripe apple"
От предположения к требованию
Бывает, что задавать значения "по-умолчанию" бессмысленно. Существует ли в природе такая вещь, как "фрукт по умолчанию"? наверное, будет предпочтительно, чтобы вид каждого фрукта задавался во время его создания. для этого необходимо ввести формальный аргумент в метод
initialize
. Мы не будем здесь вдаваться в причину почему, но аргументы, которые мы задаем в вызове метода
new
на самом деле передаются в метод
initialize
.
ruby> class Fruit | def initialize( k ) | @kind = k | @condition = "ripe" | end | end nil ruby> f5 = Fruit.new "mango" "a ripe mango" ruby> f6 = Fruit.newERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)
Гибкая инициализация
Как видно из примера выше, если с методом
initialize
ассоциирован аргумент, то его при создании объекта его нельзя отбросить с тем, чтобы не получить сообщения об ошибке. Если мы хотим быть деликатнее, то можем использовать аргумент, если он задан, в противном случае откатиться на его значение "по-умолчанию".
ruby> class Fruit | def initialize( k="apple" ) | @kind = k | @condition = "ripe" | end | end nil ruby> f5 = Fruit.new "mango" "a ripe mango" ruby> f6 = Fruit.new "a ripe apple"

Ruby → User Guide #26 - Ruby - Аксессоры
Ruby, ruby lesson, ruby уроки, user guide, руководство пользователя
Что такое аксессор?
Мы кратко обсудили @-переменные в предшествующих главах, но мало поэкспериментировали с ними. @-переменные объекта являются его атрибутами, тем, что обычно отличает его от других объектов этого же класса. Важно иметь возможность задавать и считывать значения атрибутов; для этого необходимо написание методов, называемых аксессорами атрибутов . Через мгновение мы увидим, что не всегда нужно явное задание аксессоров, но давайте сейчас полностью пройдем по этому пути. Есть два вида аксессоров - writers и readers .
ruby> class Fruit | def set_kind(k) # a writer | @kind = k | end | def get_kind # a reader | @kind | end | end nil ruby> f1 = Fruit.new #<Fruit:0xfd7e7c8c> ruby> f1.set_kind("peach") # use the writer "peach" ruby> f1.get_kind # use the reader "peach" ruby> f1 # inspect the object #<Fruit:0xfd7e7c8c @kind="peach">

Ruby → User Guide #25 - Ruby - Обработка исключительных ситуаций: ensure
Ruby, ruby lesson, ruby уроки, user guide, руководство пользователя
Иногда бывает нужна очистка по завершении работы некоторого метода. Возможно, должен быть закрыт открытый файл, буферизованные данные должны быть сброшены, и т.п., etc. Если бы существовала только одна точка выхода из метода, мы могли бы уверенно поместить код очистки в одно место и быть уверены, что он будет выполнен; однако возврат из метода может происходить из нескольких точек, или наша очистка может быть пропущена из-за возникновения исключения.
begin file = open("/tmp/some_file", "w") # ... write to the file ... file.close end
В этом примере, если ошибка возникает во время записи файла, файл останется открытым. Также не хочется обращаться к подобной избыточности:
begin file = open("/tmp/some_file", "w") # ... write to the file ... file.close rescue file.close fail # raise an exception end

Ruby → User Guide #24 - Ruby - Обработка исключительных ситуаций: rescue
Ruby, ruby lesson, ruby уроки, user guide, руководство пользователя
При выполнении программы могут возникать непредвиденные проблемы. Файл, который нужно прочитать, может не существовать; диск может оказаться полным в момент записи данных; пользователь может некорректно ввести данные.
ruby> file = open("some_file")ERR: (eval):1:in `open': No such file or directory - some_file
"Устойчивая" программа должна четко и изящно обработать такую ситуацию. Предусмотреть подобное может быть мучительной, изматывающей задачей. Предполагается, что программисты на С должны проверять результат каждого системного вызова, который потенциально может завершиться неудачей, и немедленно решить что должно быть сделано в этом случае:
FILE *file = fopen("some_file", "r"); if (file == NULL) { fprintf( stderr, "File doesn't exist.\n" ); exit(1); } bytes_read = fread( buf, 1, bytes_desired, file ); if (bytes_read != bytes_desired ) { /* do more error handling here ... */ } ...

Ruby → User Guide #23 - Ruby - Константы класса
class, constants, Ruby, Ruby уроки, user guide, руководство пользователя
Константа имеет имя, начинающееся с латинской буквы в верхнем регистре. Значение константе присваивается только один раз при инициализации. В текущей реализации Ruby повторное присваивание значения константе вызывает предупреждение, но не ошибку (не-ANSI версия eval.rb не показывает предупреждения):
ruby>fluid=30 30 ruby>fluid=31 31 ruby>Solid=32 32 ruby>Solid=33 (eval):1: warning: already initialized constant Solid 33

Ruby → User Guide #22 - Ruby - Локальные переменные
local variables, Ruby, ruby lesson, ruby уроки, user guide, локальные переменные, руководство пользователя
Локальные переменные имеют имя, начинающееся с символа нижнего подчёркивания или буквы в нижнем регистре. Локальные переменные работают не так, как глобальные переменные или переменные экземпляров классов, которые имеют значение nil до инициализации:
ruby> $foo nil ruby> @foo nil ruby> foo ERR: (eval):1: undefined local variable or method `foo' for main(Object)
При первом назначении вы создаёте локальную переменную выполняя её объявление. Если обратиться к неинициализированной локальной переменной, то интерпретатор Ruby подумает об этом, как о попытке вызвать метод с этим именем; соответственно вы увидите сообщение об ошибке.

Ruby → User Guide #21 - Ruby - переменные экземпляра класса
Instance variables, Ruby, ruby lesson, ruby уроки, user guide, переменные класса, руководство пользователя
Имена переменных класса начинаются с символа @, и их область применения ограничивается областью видимости внутри класса, то есть той областью, на которую можно сослаться, используя переменную self . Два различных объекта, даже если они относятся к одному класса, могут иметь различные значения их переменных экземпляра класса. Снаружи объекта, переменные экземпляра не могут быть изменены или просмотрены (то есть переменные экземпляра класса в Ruby никогда не бывают публичными, public ), исключая те случаи, когда программист предусматривает для этого специальные методы. Как и в случае глобальных переменных, переменные экземпляра класса имеют значение nil , до тех пор, пока не будут инициализированы.

Ruby → User Guide #20 - Ruby - глобальные переменные
global variables, Ruby, ruby lesson, ruby уроки, user guide, глобальные переменные, руководство пользователя
Глобальные переменные имеют имя, которое начинается с символа $ . Данная переменная может быть доступна из любого места программы. Перед инициализацией глобальная переменная имеет особое значение nil.
ruby> $foo nil ruby> $foo = 5 5 ruby> $foo 5
Глобальные переменные следует использовать с осторожностью. Они очень опасны, потому что они могут быть перезаписаны откуда угодно. Чрезмерное использование глобальных переменных может затруднить отлов багов. Это также является звоночком, что дизайн программы не был тщательно продуман. Всякий раз, когда вы используете глобальную переменную, убедитесь что даёте ей имя, которое вряд ли будет использовано где либо ещё (например, назвать глобальную переменную как $foo явно плохая идея)

Ruby → User Guide #19 - Ruby - переменные
Ruby, ruby lesson, ruby уроки, user guide, variables, переменные, руководство пользователя
Ruby имеет три вида переменных, один вид констант и ровно две псевдо-переменных. Переменные и константы не имеют типов. Хотя нетипизированные переменные и имеют некоторые недостатки, в тоже время они имеют гораздо больше преимуществ и хорошо сочетаются с быстрой и простой философией Ruby.
В большинстве языков переменные должны быть объявлены для того, чтобы указать их тип, модифицируемость (то есть должны ли они быть константами) и область применения; в то время как первое не является проблемой, то остальное можно увидеть из имени переменной, поэтому мы не нуждаемся в объявлении переменной в Ruby.
Первый символ в имени указывает категорию переменной:
- $ - глобальная переменная
- @ - переменная класса
- [a-z] или _ - локальная переменная
- [A-Z] - константа
Timeweb
Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.
В течение многих лет Timeweb доказывает свою стабильность.
Для проектов на Django рекомендую VDS хостинг
Посмотреть Хостинг