Читаем Программирование на языке Ruby. Идеология языка, теория и практика применения полностью

• Напоследок рассмотрим несколько искусственный пример. Внутри блока итератора times создается новый контекст, так что x — локальная переменная. Переменная closure уже определена на верхнем уровне, поэтому для блока она не будет локальной.

closure = nil # Определим замыкание, чтобы его имя было известно.

1.times do    # Создаем новый контекст.

 x = 5        # Переменная x локальная в этом блоке,

 closure = Proc.new { puts "В замыкании, x = #{x}" }

end

x = 1

# Определяем x на верхнем уровне.

closure.call # Печатается: В замыкании, x = 5

Обратите внимание, что переменная x, которой присвоено значение 1, — это новая переменная, определенная на верхнем уровне. Она не совпадает с одноименной переменной, определенной внутри блока. Замыкание печатает 5, так как запоминает контекст своего создания, в котором была определена переменная x со значением 5.

• Переменные с именами, начинающимися с одного символа @, определенные внутри класса, — это, вообще говоря, переменные экземпляра. Однако если они определены вне любого метода, то становятся переменными экземпляра класса. (Это несколько противоречит общепринятой терминологии ООП, в которой «экземпляр класса» — то же самое, что и «экземпляр>> или «объект».) Пример:

class Myclass

 @x = 1  # Переменная экземпляра класса.

 @y = 2  # Еще одна.

 def mymethod

  @x = 3 # Переменная экземпляра.

  # Заметим, что в этой точке @y недоступна.

 end

end

Переменная экземпляра класса (@y в предыдущем примере — в действительности атрибут объекта класса Myclass, являющегося экземпляром класса Class. (Напомним, что Class — это объект, a Object — это класс.) На переменные экземпляра класса нельзя ссылаться из методов экземпляра и, вообще говоря, они не очень полезны.

attr, attr_reader, attr_writer и attr_accessor — сокращенная запись для определения методов чтения и установки атрибутов. В качестве аргументов они принимают символы (экземпляры класса Symbol).

• Присваивание переменной, имя которой содержит оператор разрешения области видимости, недопустимо. Например, Math::Pi = 3.2 — ошибка.

<p>1.5.5. Ориентация на выражения и прочие вопросы</p>

В Ruby выражения важны почти так же, как предложения. Для программиста на С это звучит знакомо, а для программиста на Pascal — откровенная нелепость. Но Ruby ориентирован на выражения даже в большей степени, чем С.

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

• В Ruby любое присваивание возвращает то же значение, которое стоит в правой части. Поэтому иногда мы можем немного сократить код, как показано ниже, но будьте осторожны, имея дело с объектами! Не забывайте, что это почти всегда ссылки.

x = y = z = 0  # Все переменные сейчас равны 0.

а = b = с = [] # Опасно! a, b и с ссылаются

               # на ОДИН И ТОТ ЖЕ пустой массив.

x = 5

y = x += 2 # Сейчас x и у равны 7.

Напомним однако, что значения типа Fixnum и им подобные хранятся непосредственно, а не как ссылки на объекты.

• Многие управляющие конструкции возвращают значения, в частности if, unless и case. Следующий код корректен; он показывает, что при принятии решения ветви могут быть выражениями, а не полноценными предложениями.

а = 5

x = if а < 8 then 6 else 7 end # x равно 6.

y= if a<8 # y тоже равно 6;

 6        # предложение if может располагаться

else      # на одной строке

 7        # или на нескольких.

end

# unless тоже работает; z присваивается значение 4.

z = unless x == y then 3 else 4 end

t = case a # t получает

 when 0..3 # значение

  "low"    # medium,

 when 4..6

  "medium"

 else

  "high"

end

Здесь мы сделали такие отступы, будто case является присваиванием. Мы воспринимаем такую запись спокойно, хотя вам она может не понравиться.

• Отметим, что циклы while и until, напротив, не возвращают никаких полезных значений; обычно их значением является nil:

i = 0

x = while (i < 5) # x равно nil.

 puts i+=1

end

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных