Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

User Guide #11 - Ruby - методы

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

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

В Ruby мы вызываем метод объекта с помощью точечной нотации (как в C++ или Java). Объект, к которому обращаемся лежит слева от точки.

ruby> "abcdef".length
   6

Интуитивно понятно, что объект является строкой и её спрашивает о её длине. Технически, мы вызываем метода length у объекта "abcdef" .

Другие объекты могут иметь несколько различные интерпретации метода length, или не иметь его вовсе. Решения о том, как отвечать на сообщение принимаются на лету, во время работы программы, и действия принимаются в зависимости от того, что это за переменная.

ruby> foo = "abc"
   "abc"
ruby> foo.length
   3
ruby> foo = ["abcde", "fghij"]
   ["abcde", "fghij"]
ruby> foo.length
   2

Мы подразумеваем, что length может зависеть от того, о каком объекте мы говорим. В первый раз мы спрашивали foo о его длине в примере выше, что относилось к простой строке, и имелся только один возможный ответ. Второй раз, foo выступал в качестве массива, и мы могли предположить что length может быть 2, 5 или 10. Но, как правило, правильный ответ будет 2 (другие виды length могут также фигурировать, если пожелаете).

ruby> foo[0].length
   5
ruby> foo[0].length + foo[1].length
   10

Заметьте, что массив знает о том, что он является массивом. Кусочки данных в Ruby имеют представление о том, чем они являются, это позволяет автоматически выполнять требуемые действия в различных ситуациях. Это освобождает программиста от необходимости запоминать большое количество имён функций, поскольку относительно малое число имён методов, соотносится с концепцией, которые мы знаем из обычного языка, и может быть применено к различным видам данных, и мы получим ожидаемый результат. Этот функционал в объектно-ориентированном программировании называется полиморфизмом.

Когда объект принимает сообщение, которое не понимает, он вызывает ошибку:

ruby> foo = 5
   5
ruby> foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)

Таким образом необходимо знать, какие методы применимы к объекту, хотя и не обязательно понимать, как методы работают.

Если в метод передаются аргументы, то они, как правило, заключаются в круглые скобки.

object.method(arg1, arg2)

но они могут быть и опущены, если не возникает неоднозначности

object.method arg1, arg2

В Ruby имеется специальная переменная self , которая относится к любому объекту вызывающему метод. Это случается довольно часто, когда удобно использовать "self." , хотя при вызове метода изнутри оператор может быть и опущен.

self.method_name(args...)

или

method_name(args...)

То, что мы думаем о традиционном вызове функции, просто является способом записи вызова метода с помощью self . Это делает Ruby то, что называется объектно-ориентированным языком. Тем не менее, функционально методы скорее похожи на функции в других языках программирования, что является преимущество для тех, кто не подозревает о том, что вызываемые функции являются методами объектов в Ruby. Мы можем говорить о функциях, как если бы они не были на самом деле методам объектом, если хотим.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
МК
13 января 2019 г. 20:35
Мария Канева

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

  • Результат:91баллов,
  • Очки рейтинга8
МК
13 января 2019 г. 20:32
Мария Канева

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

  • Результат:70баллов,
  • Очки рейтинга1
МК
13 января 2019 г. 20:28
Мария Канева

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

  • Результат:78баллов,
  • Очки рейтинга2
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
15 января 2019 г. 16:53
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
15 января 2019 г. 12:52
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
ПБ
14 января 2019 г. 14:27
Павел Богдевич

Да
m
13 января 2019 г. 16:52
mihamuz

И так может кому будет интересно решил свою проблему следующим путем.Через дизайнер в базовый виджет добавил QQuickWidget (назвал его listProducts)Это соответственно убрал. this->m_qu...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы