Расширенный поиск
Евгений Легоцкой26 августа 2016 г. 3:56

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

Ruby, ruby lesson, ruby уроки, user guide, руководство пользователя

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

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

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

Комментарии

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

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

Евгений Легоцкой26 августа 2016 г. 3:52

RubyUser 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"
Евгений Легоцкой26 августа 2016 г. 3:21

RubyUser 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">
Евгений Легоцкой26 августа 2016 г. 3:18

RubyUser 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
Евгений Легоцкой26 августа 2016 г. 3:09

RubyUser 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 ... */
}
...
Евгений Легоцкой25 августа 2016 г. 3:05

RubyUser 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
Евгений Легоцкой10 июля 2016 г. 3:03

RubyUser 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 подумает об этом, как о попытке вызвать метод с этим именем; соответственно вы увидите сообщение об ошибке.

Евгений Легоцкой10 июля 2016 г. 3:01

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

Instance variables, Ruby, ruby lesson, ruby уроки, user guide, переменные класса, руководство пользователя

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

Евгений Легоцкой29 июня 2016 г. 2:59

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

global variables, Ruby, ruby lesson, ruby уроки, user guide, глобальные переменные, руководство пользователя

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

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

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

Евгений Легоцкой29 июня 2016 г. 2:57

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

Ruby, ruby lesson, ruby уроки, user guide, variables, переменные, руководство пользователя

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

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

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

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

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

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

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

Посмотреть Хостинг
Е

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

  • Результат:0баллов,
  • Очки рейтинга-10
J
  • Jenek
  • 17 января 2021 г. 15:40

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:10баллов,
  • Очки рейтинга-10
ЕК

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:90баллов,
  • Очки рейтинга8
Последние комментарии
r
  • retmas
  • 17 января 2021 г. 4:09

Qt/C++ - Урок 074. Генерация псевдослучайных чисел с использованием случайной библиотеки STD

Дмитрий, решает. Просто автор, видимо, не сильно озаботился изучением документации QRandomGenerator. Да и в листинге с использованием qrand вызов функции qsrand на каждой итерации цикла нав…
g
  • gromoff
  • 10 января 2021 г. 12:53

Поздравляю всё Сообщество EVILEG с Новым Годом!!!

#include <iostream>using namespace std;int main() { cout << "Happy New Year and Thank you!"; return 0;}
МЗ
МЗ

Django - Урок 003. Модель, шаблон и представление в Django

from django.shortcuts import *from django.http import *from django.http import HttpResponseRedirectfrom django.contrib.auth.forms import *from django.urls import reverse_lazyfrom django.views …
Сейчас обсуждают на форуме

Не получается prefetch_related на M2M полях

join случается, если делать select_related префетч делается в два запроса - сначала изначальный запрос, а потом связанные с ним объекты. мерж этих запросов происходит в рантайме можн…

Проблемы с QTableView

кто-нибуль может подсказать как воткнуть QWidget в tableview header ?

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Если у вас модель, в переопределнном методе QVariant data надо привязываться к Qt::EditRole, это если открывающийся диалог редактирования является частью таблицы
t

Работа с потоками в разных версиях Qt

Добрый день, впервые начал проект в котором активно используются потоки и наткнулся на один не очень приятный момент, например: Существует главный поток (GUI) и созданный поток. Связь…
e
  • eviza
  • 13 января 2021 г. 6:08

QSerialPort. Как правильнее проверить сигнал CTS?

Здравствуйте! Есть задача отслеживать изменение сигнала CTS, можно ли это сделать по таймеру методом QSerialPort::pinoutSignals()?
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB