Расширенный поиск

RubyUser Guide #28 - Ruby - Фишки

Эта глава посвящена некоторым практическим приемам.

Разделители выражений

В некоторых языках необходимо соблюдение некоторых правил пунктуации; часто используется точка с запятой ( ; ), для обозначения окончания выражения в программе.  Ruby вместо этого следует соглашениям, используемым в шеллах, таких как sh или csh .  Множественные выражения в одной строке должны разделяться точкой с запятой, но это не обязательно в конце строки; перевод строки трактуется как точка с запятой.  Если линия заканчивается обратным слэшем ( \ ), перевод строки игнорируется; это позволяет разнести длинный оператор на несколько строк.

Комментарии

Зачем писать комментарии?  Хотя хорошо написанный код имеет тенденцию к самодокументированию, часто бывает полезно делать заметки на полях; будет ошибкой думать, что другие смогут немедленно сказать что делает Ваш код лишь мельком взглянув на него (как это можете Вы). Кроме того, вы можете оказаться в роли этого другого человека всего лишь несколько дней спустя; кто из нас не возвращался спустя некоторое время к старой программе чтобы что-то дописать или исправить ее и не говорил "Я знаю, что это писал я. Но, черт побери, что вот это значит?"

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

RubyUser Guide #27 - Ruby - Инициализация объектов

В нашем классе 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"

RubyUser Guide #26 - Ruby - Аксессоры

Что такое аксессор?

Мы кратко обсудили @-переменные в предшествующих главах, но мало поэкспериментировали с ними.  @-переменные объекта являются его атрибутами, тем, что обычно отличает его от других объектов этого же класса.  Важно иметь возможность задавать и считывать значения атрибутов; для этого необходимо написание методов, называемых аксессорами атрибутов .  Через мгновение мы увидим, что не всегда нужно явное задание аксессоров, но давайте сейчас полностью пройдем по этому пути.  Есть два вида аксессоров - 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">

RubyUser Guide #25 - Ruby - Обработка исключительных ситуаций: ensure

Иногда бывает нужна очистка по завершении работы некоторого метода.  Возможно, должен быть закрыт открытый файл, буферизованные данные должны быть сброшены, и т.п., 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

RubyUser Guide #24 - Ruby - Обработка исключительных ситуаций: rescue

При выполнении программы могут возникать непредвиденные проблемы.  Файл, который нужно прочитать, может не существовать; диск может оказаться полным в момент записи данных; пользователь может некорректно ввести данные.

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 ... */
}
...

RubyUser Guide #23 - Ruby - Константы класса

Константа имеет имя, начинающееся с латинской буквы в верхнем регистре. Значение константе присваивается только один раз при инициализации. В текущей реализации 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

RubyUser Guide #22 - Ruby - Локальные переменные

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

ruby> $foo
   nil
ruby> @foo
   nil
ruby> foo
ERR: (eval):1: undefined local variable or method `foo' for main(Object)

При первом назначении вы создаёте локальную переменную выполняя её объявление. Если обратиться к неинициализированной локальной переменной, то интерпретатор Ruby подумает об этом, как о попытке вызвать метод с этим именем; соответственно вы увидите сообщение об ошибке.

RubyUser Guide #21 - Ruby - переменные экземпляра класса

Имена переменных класса начинаются с символа @, и их область применения ограничивается областью видимости внутри класса, то есть той областью, на которую можно сослаться, используя переменную self . Два различных объекта, даже если они относятся к одному класса, могут иметь различные значения их переменных экземпляра класса. Снаружи объекта, переменные экземпляра не могут быть изменены или просмотрены (то есть переменные экземпляра класса в Ruby никогда не бывают публичными, public ), исключая те случаи, когда программист предусматривает для этого специальные методы. Как и в случае глобальных переменных, переменные экземпляра класса имеют значение nil , до тех пор, пока не будут инициализированы.

RubyUser Guide #20 - Ruby - глобальные переменные

Глобальные переменные имеют имя, которое начинается с символа $ . Данная переменная может быть доступна из любого места программы. Перед инициализацией глобальная переменная имеет особое значение nil.

ruby> $foo
   nil
ruby> $foo = 5
   5
ruby> $foo
   5

Глобальные переменные следует использовать с осторожностью. Они очень опасны, потому что они могут быть перезаписаны откуда угодно. Чрезмерное использование глобальных переменных может затруднить отлов багов. Это также является звоночком, что дизайн программы не был тщательно продуман. Всякий раз, когда вы используете глобальную переменную, убедитесь что даёте ей имя, которое вряд ли будет использовано где либо ещё (например, назвать глобальную переменную как $foo явно плохая идея)

RubyUser Guide #19 - Ruby - переменные

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

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

Первый символ в имени указывает категорию переменной:

  • $ - глобальная переменная
  • @ - переменная класса
  • [a-z] или _ - локальная переменная
  • [A-Z] - константа
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
s
3 июня 2020 г. 1:56
silo1995

C++ - Тест 003. Условия и циклы

  • Результат:35баллов,
  • Очки рейтинга-10
АП
2 июня 2020 г. 21:11
Алексей Пикенин

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
2 июня 2020 г. 13:04
Даниил Чижевский

C++ - Тест 001. Первая программа и типы данных

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
s
3 июня 2020 г. 14:00
safevgeniia

Qt/C++ - Урок 036. QWebView - пишем простейший браузер на Qt

Вроде вск записала правильно, все подключила . Проблем со сборко нет. НО вместо сайта выводится белый экран просто. В чем проблема может быть? По задумке, при нажатии на кнопку долже…
МА
3 июня 2020 г. 11:40
Михаил А

Qt/C++ - Урок 050. Логирование событий Qt приложения в текстовый файл

Как только переношу в класс метод messageHandler, он подчеркнут ошибкой в конструкторе: qInstallMessageHandler(messageHandler); Сам метод в классе называется уже: void Customers::mess…
МА
3 июня 2020 г. 10:13
Михаил А

Qt/C++ - Урок 050. Логирование событий Qt приложения в текстовый файл

Вопрос- как перенести из файла .cpp // Умный указатель на файл логированияQScopedPointer<QFile> m_logFile;// Объявляение обработчикаvoid messageHandler(QtMsgType type, const QMessa…
3 июня 2020 г. 5:16
Евгений Легоцкой

Django - Урок 048. Как добавить статус онлайн на сайте

Добрый день. Конечно, нужно будет только шаблонный тег написать, который будет забирать всех пользователей онлайн, проверяя группу текущего пользователя. У меня пользователи онлайн на …
3 июня 2020 г. 4:43
Владислав Меленчук

Django - Урок 048. Как добавить статус онлайн на сайте

Доброго дня. А можно реализовать с помощью этой фичи вывод блок "Пользователи онлайн" и окрашивать взависимости от группы юзера? Как в скрине ниже. Screenshot_36.png
Сейчас обсуждают на форуме
f
3 июня 2020 г. 1:49
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
2 июня 2020 г. 2:46
Евгений Легоцкой

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
2 июня 2020 г. 2:01
Евгений Легоцкой

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
a
1 июня 2020 г. 10:26
alekseyttrv

SSL на Android

у меня стоит версия Qt 5.14.2. В настройках android поставил openssl из коробки, и этот прроект автоматически стянулся. Достаточно было только добавить в .pro-файл строку после этого и все …
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB