Rubyn: различия между версиями

Содержимое удалено Содержимое добавлено
м орфография
Строка 1288:
 
=== Что используется в качестве ключей? ===
В качестве ключей ассоциативного массива можно использовать любые типы. Например, другие ассоциативные массивы, строки, числа, символы или просто обьектыобъекты любых классов.
 
{{Внимание|Если состояние объектов-ключей изменилось, то хешу необходимо вызвать метод <code>.rehash</code>.}}
Строка 1303:
В данном примере ключами хеша (<code>xew</code>) являются два массива (<code>maccuB_1</code> и <code>maccuB_2</code>). Одному из них (<code>maccuB_1</code>) мы изменили нулевой элемент (с «а» на «я»). После этого доступ к значению был потерян. После выполнения метода <code>.rehash</code> все встало на свои места.
 
{{info|''Как Руби отслеживает изменение ключа в ассоциативном массиве? Очень просто: с помощью метода <code>.hash</code>, который генерирует "контрольную сумму" обьектаобъекта в виде целого числа. Например: <code>[1,2,3].hash #-> 25</code>''}}
 
=== Способы создания ассоциативного массива ===
Строка 2239:
 
==== Методы преобразования к строке ====
Руби сам преобразует типы для некоторых простых операций. Например, при включении строки в другую он воспользуется имеющимся у обьектаобъекта методом <code>.to_s</code>:
 
<source lang=ruby>class Container
Строка 2251:
p "Это #{cont}" #-> "Это контейнер"</source>
 
Если нужно, чтобы ваши обьектыобъекты упорядочивались и сравнивались с обычными строками, следует применять примесь <code>Comparable</code> и единственный специальный метод <code>to_str</code>. Наличие этого метода у вашего объекта — знак для Ruby, что для сравнения следует применять не встроенный в <code>String</code> метод, а ваш.
 
<source lang=ruby>class Container
Строка 2292:
 
== Подробнее о методах ==
Все функции в Ruby являются методами, то есть свойственны обьектамобъектам. При программировании на это можно не обращать внимания, поскольку любая программа на Руби уже является определением класса. У методов могут быть обязательные или необязательные параметры. Методы разграничиваются фигурными скобками или ключевыми словами <code>def</code> и <code>end</code>.
 
=== Создание метода ===
Строка 2366:
p "Array has something" if arr.any?</source>
 
Методы с восклицательным знаком на конце меняют обьектобъект, к которому привязаны.
 
<source lang=ruby>string = " Some string with spaces "
Строка 2451:
 
* Поддержание индекса в цикле
* Забота об итераторах как отдельных обьектахобъектах
* Закрытие ресурса после его использования
* Забота о контексте, в котором выполняется операция
Строка 2638:
 
==== Как добавить метод к массиву/строке/венику? ====
Важно помнить, что в Ruby все типы являются обьектамиобъектами, даже сами классы. Каждый класс до конца выполнения программы остается открытым, а это значит, что в любой тип можно добавить собственные методы (или изменить поведение существующих). Каждый класс можно определять постепенно, в нескольких частях программы:
 
<code>class BeHuK
Строка 2675:
{{Внимание|операция расширения класса (добавление нового метода к существующему) по сути не отличается от создания нового класса.}}
 
У обьектовобъектов в Ruby есть методы класса и методы экземпляра — в нашем примере <code>consonants</code> — это именно методы экземпляра. При создании нового класса или изменении существующего создать метод класса можно, начав его имя с имени класса или с <code>self</code> и точки:
 
<code>str = "Crazy fox jumps over a lazy dog"
Строка 2715:
будут удалены. Так что даже в этом случае [[w:велосипед|велосипед]] изобретать не стоит!}}
 
Если к классу надо добавить много методов сразу, то при описании класса можно выйти на уровень его обьектаобъекта-класса. Это свойство в Ruby называется '''eigenclass''' ({{нем|eigen}} = «свой, особый»). Подозревая, что многие из читателей незнакомы с математическим понятием [[w:Собственные вектора, значения и пространства|собственного значения/вектора/пространства]], мы кратко и по-программистски назовём eigenclass '''эйгенклассом'''.
 
Добавим к классу <code>File</code> метод <code>myself</code>, который дает быстрый доступ к текущему файлу с исходным кодом: