Реклама
26 августа 2016 г. 13:56

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

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

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

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

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

Комментарии

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

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

26 августа 2016 г. 13: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 г. 13: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 г. 13: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 г. 13: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 г. 23:00

LinuxТоп 10 Разработчиков и Компаний, внёсших вклад в ядро Linux в 2015-2016 годах

Linux, 25 лет, Linux Kernel

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

В версии ядра 4.6 можно увидеть около 13,517 патчей влитых за 63 дня, что равно рекорду, установленному версией 3,15 в объёме 13,722 патчей 8 июня 2014.

Но изменения в ядро вносятся сломя голову последние 15 месяцев, с количеством в более чем 3 миллиона строк, добавленных в ядро Linux со скоростью 7,8 изменений в час.

"Способность поддерживать данную скорость изменений в течение многих лет является беспрецедентной для какого-либо общественного проекта программного обеспечения" - согласно отчёту.

Седьмое издание этого отчёта детализирует информацию по разработчикам, внёсшим вклад в ядро, и компаниям, в которых они работают, и наиболее важные изменения сделанные в коде в процессе разработки ядра с версии 3.18. Данные охватывают в основном разработку с последнего отчёта в Марте 2015 -- версии с 3.19 по 4.7 -- но некоторая статистика охватывает и 2005 год, когда разработка была перемещена в Git репозиторий, и даже охватывает первый выпуск Линуса Торвальдса в 1991 году.

25 августа 2016 г. 21:47

QtОт Visual Studio Add-In к Qt VS Tools (Beta)

Add-in, Qt VS Tools

Прошло почти три года с последнего официального выпуска Qt Visual Studio Add-in , но сейчас разработчики Qt предлагают кое-что новое: Qt VS Tools. Beta версию можно скачать с Qt Downloads для тестирования. Размер пакета был снижен с 200 Мб до 7 Мб.

В будущем планируется сделать Qt VS Tools доступным из Visual Studio Gallery с возможностью установки из Visual Studio 2013 и 2015. Необходимо обратить внимание на то, что поддержка старых версий Visual Studio прекращена. Перед установкой необходимо убедиться, что старая версия Qt Visual Studio Add-in удалена, поскольку совместно эти дополнения плохо работают.

Когда Вы начнёте использовать Qt VS Tools, Вы найдёте Qt New Item и New Project шаблоны в Templates|Visual C++|Qt . Не требуется использовать какие-либо пункты из визарда, названного Qt5, поскольку это артефакты Add-in.

25 августа 2016 г. 21:04

QtQt/C++ - Урок 053. Сборка IBASE SQL драйвера Qt 5.7 на openSUSE Leap 42.1

FireBird, IBASE, Leap, openSUSE, Qt, SQL

Установка Qt 5.7 на openSUSE Leap 42.1

Скачиваем последнюю версию Qt для Linux:

wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run

Делаем файл исполняемым

chmod +x qt-unified-linux-x64-online.run

Устанавливаем gcc, make и прочие необходимые библиотеки:

sudo zypper install --type pattern devel_basis

Далее устанавливаем Qt:

./qt-unified-linux-x64-online.run

Следуем указаниям графического инсталятора. Не забываем отметить пункт Source для установки исходных кодов библиотек.

25 августа 2016 г. 13: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
30 июля 2016 г. 22:03

QtQt WinAPI - Урок 004. QtIFW - Автоматизация WinDeployQt и сборки инсталляторов с Qt Installer Framework

Qt, Qt Installer Framework, QtIFW, windeployqt

Правильный программист - это ленивый программист. Если есть возможность что-то автоматизировать, то обязательно нужно это сделать. Например, можно сделать автоматическое выполнение windeployqt со сборкой онлайн и оффлайн инсталляторов, а также подготовкой репозитория приложения с помощью Qt Installer Framework и чёрной магии QMake .

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

Но автоматизацию windeployqt оставим в основном проекте.

Структура проекта

Итак, имеем проект, с двумя подпроектами:

  1. Hello.pro - проект приложения
  2. Installer.pro -  проект инсталлятора

Основной проект представляет собой самый обычный "Hello world", но самый большой интерес заключается в скрипте QMake, который отвечает за windeployqt приложения.

Второй проект имеет минимальную структуру для сборки оффлайн и онлайн инсталляторов, а также сборки репозитория. Скрипт QMake в профайле проекта также содержит необходимую информацию для автоматизации сборки инсталляторов.

Реклама
  • MinusNol
  • 18 октября 2017 г. 16:09

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

  • Результат - 85 баллов
  • MinusNol
  • 18 октября 2017 г. 15:41

C++ - Тест 002. Константы

  • Результат - 58 баллов
  • loctyr
  • 18 октября 2017 г. 10:25

Qt - Тест 001. Сигналы и слоты

  • Результат - 94 баллов
Последние комментарии
  • EVILEG
  • 18 октября 2017 г. 14:45

QML - Урок 031. Отключаем системное обрамление окна в QML и пишем код для обработки перемещения и ресайза окна

Задать свои property в окне и проверять их в методах изменения размера для topArea, bottomArea, rightArea, leftArea. В обработчиках onMouseYChanged, onMouseXChanged. Из-за отключен...

  • Troffe
  • 18 октября 2017 г. 14:35

QML - Урок 031. Отключаем системное обрамление окна в QML и пишем код для обработки перемещения и ресайза окна

После отключения системного обрамления не работают minimumHeight и minimumWidth. Что делать?

  • cordsac
  • 17 октября 2017 г. 15:29

Qt/C++ - Урок 045. SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

Sir I post is as a topic,please help me to solve this problem

  • EVILEG
  • 17 октября 2017 г. 11:44

Qt/C++ - Урок 045. SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

I think You have another version of SVG file. First, need to see content of SVG file. It is simple XML-format, therefore just need to research content. Do You want just open SVG file or ...

  • cordsac
  • 17 октября 2017 г. 2:09

Qt/C++ - Урок 045. SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

Sir,I tried your code for open ellipse item.but my program not open ellipse item.what should I need to do? here is my code : readsvg.cpp QL...

Сейчас обсуждают на форуме
  • cordsac
  • 17 октября 2017 г. 19:28

How can I open SVG file through QT

Okay,Thank you sir :)

  • EVILEG
  • 16 октября 2017 г. 20:34

Qt, Загрузка изображения в QImage

Сам view нужно поместить в внутри окна, а не просто создать его. Можете создать в графическом редакторе Qt Creator`а окно, набросать там QGraphicsView и потом посмотреть в сгенерированном...

  • mihenze
  • 15 октября 2017 г. 21:30

Рисуем линию QGraphicsItem за мышью

Большое спасибо!

  • EVILEG
  • 15 октября 2017 г. 18:58

Описание класса С++ в QtCreator

Для начала добавьте недостающие методы и участники для Q_PROPERTY. Для этого вызовите контекстное меню через ПКМ у Q_PROPERTY, там будет пункт "добавить недостающие члены". Автоматически...

  • EVILEG
  • 15 октября 2017 г. 15:34

Qt+Google Drive

Добрый день! Как-то не занимался этим, поэтому такого примера у меня нет в загашниках.