-->

Программирование на языке Ruby

На нашем литературном портале можно бесплатно читать книгу Программирование на языке Ruby, Фултон Хэл-- . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Программирование на языке Ruby
Название: Программирование на языке Ruby
Дата добавления: 16 январь 2020
Количество просмотров: 514
Читать онлайн

Программирование на языке Ruby читать книгу онлайн

Программирование на языке Ruby - читать бесплатно онлайн , автор Фултон Хэл
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов. Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии. Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 70 71 72 73 74 75 76 77 78 ... 266 ВПЕРЕД
Перейти на страницу:

Можно даже использовать символы для определения переменных и методов экземпляра, но тогда для ссылки на них пришлось бы применять такие методы, как

send
и
instance_variable_get
. Вообще говоря, такая практика не рекомендуется.

6.1.1. Символы как перечисления

В языке Pascal и в поздних версиях С есть понятие перечисляемого типа. В Ruby ничего подобного быть не может, ведь никакого контроля типов не производится. Но символы часто используются как мнемонические имена; стороны света можно было бы представить как

:north
,
:south
,
:east
и
:west
.

Быть может, немного понятнее хранить их в виде констант:

North, South, East, West = :north, :south, :east, :west

Если бы это были строки, а не символы, то определение их в виде констант могло бы сэкономить память, но каждый символ все равно существует в объектном пространстве в единственном экземпляре. (Символы, подобно объектам

Fixnum
, хранятся как непосредственные значения.)

6.1.2. Символы как метазначения

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

В таком механизме часто возникает необходимость. Когда-то символ NUL кода ASCII вообще не считался символом. В языке С есть понятие нулевого указателя (

NULL
), в Pascal есть указатель
nil
, в SQL NULL означает отсутствие какого бы то ни было значения. В Ruby, конечно, тоже есть свой
nil
.

Проблема в том, что такие метазначения часто путают с действительными значениями. В наши дни все считают NUL настоящим символом кода ASCII. И в Ruby нельзя сказать, что

nil
не является объектом; его можно хранить, над ним можно выполнять какие-то операции. Поэтому не вполне понятно, как интерпретировать ситуацию, когда
hash [key]
возвращает
nil
: то ли указанный ключ вообще не найден, то ли с ним ассоциировано значение
nil
.

Идея в том, что иногда символы могут выступать в роли подходящих метазначений. Представьте метод, который получает строку из сети (возможно, по протоколу HTTP или иным способом). При желании можно было бы вернуть нестроковое значение как индикатор исключительной ситуации.

str = get_string

case str

 when String

  # Нормальная обработка.

 when :eof

  # Конец файла, закрытие сокета и т.п.

 when :error

  # Ошибка сети или ввода/вывода.

 when :timeout

  # Ответ не получен вовремя.

end

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

6.1.3. Символы, переменные и методы

Наверное, чаще всего символы применяются для определения атрибутов класса:

class MyClass

 attr_reader :alpha, :beta

 attr_writer :gamma, :delta

 attr_accessor :epsilon

 # ...

end

Имейте в виду, что в этом фрагменте на самом деле исполняется некий код. Например,

attr_accessor
использует имя символа для определения имени переменной экземпляра, а также методов для ее чтения и изменения. Это не означает, что всегда имеется точное соответствие между символом и именем переменной экземпляра. Например, обращаясь к методу
instance_variable_set
, мы должны задать точное имя переменной, включая и знак @:

sym1 = :@foo

sym2 = :foo

instance_variable_set(sym1,"str") # Правильно.

instance_variable_set(sym2,"str") # Ошибка.

Короче говоря, символ, передаваемый методам из семейства

attr
, — всего лишь аргумент, а сами эти методы создают требуемые переменные и методы экземпляра, основываясь на значении символа. (В конец имени метода изменения добавляется знак равенства, а в начало имени переменной экземпляра — знак @.) Бывают также случаи, когда символ должен точно соответствовать идентификатору, на который ссылается.

В большинстве случаев (если не во всех!) методы, ожидающие на входе символ, принимают также строку. Обратное не всегда верно.

6.1.4. Преобразование строки в символ и обратно

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

to_str
и
to_sym
:

a = "foobar"

b = :foobar

a == b.to_str # true

b == a.to_sym # true

Для метапрограммирования иногда бывает полезен такой метод:

class Symbol

 def +(other)

  (self.to_s + other.to_s).to_sym

 end

end

Он позволяет конкатенировать символы (или дописывать строку в конец символа). Ниже приведен пример использования; мы принимаем на входе символ и пытаемся определить, представляет ли он какой-нибудь метод доступа (то есть существует ли метод чтения или установки атрибута с таким именем):

class Object

 def accessor?(sym)

  return (self .respond_to?(sym) and self .respond_to?(sym+"="))

 end

end

Упомяну также о более изощренном способе применения символов. Иногда при выполнении операции map нужно указать сложный блок. Однако во многих случаях мы просто вызываем некоторый метод для каждого элемента массива или набора:

list = words.map {|x| x.capitalize }

He кажется ли вам, что для такой простой задачи слишком много знаков препинания? Давайте вместо этого определим метод

to_proc
в классе
Symbol
. Он будет приводить любой символ к типу объекта
proc
. Но какой именно объект
proc
следует вернуть? Очевидно, соответствующий самому символу в контексте объекта; иными словами, такой, который пошлет сам символ в виде сообщения объекту.

1 ... 70 71 72 73 74 75 76 77 78 ... 266 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название