Object — различия между версиями
Korvin (обсуждение | вклад) м |
(→inspect: !!!!!!!!) |
||
(не показаны 12 промежуточных версий 3 участников) | |||
Строка 4: | Строка 4: | ||
'''Родители''': <tt>Object</tt> <br> | '''Родители''': <tt>Object</tt> <br> | ||
− | '''Методы''': <tt>[[#class|class]] [[#className|className]] [[#instanceOf|instanceOf]] [[#call|call]] [[#invoke|invoke]] [[#freeze|freeze]] [[#frozen|frozen]] [[#clone|clone]] [[#inspect|inspect]] [[#equals|equals]] [[#hasMethod|hasMethod]] [[#getMethod|getMethod]] [[#methods|methods]]</tt><br> | + | '''Методы''': <tt>[[#class|class]] [[#className|className]] [[#instanceOf|instanceOf]] [[#call|call]] [[#invoke|invoke]] [[#freeze|freeze]] [[#frozen|frozen]] [[#clone|clone]] [[#dup|dup]] [[#inspect|inspect]] [[#equals|equals]] [[#hasMethod|hasMethod]] [[#getMethod|getMethod]] [[#methods|methods]]</tt><br> |
− | ''' | + | '''Реализует операторы''': <tt>[[#equals|==]]</tt> |
__NOTOC__ | __NOTOC__ | ||
Строка 11: | Строка 11: | ||
== class == | == class == | ||
− | '''Возвращает''': <tt>[[ | + | '''Возвращает''': <tt>[[Class]]</tt> <br> |
− | Метод возвращает инстанцию класса <tt>[[ | + | Метод возвращает инстанцию класса <tt>[[Class]]</tt>, соответствующую классу данного объекта. Например: |
<source lang="kpp"> | <source lang="kpp"> | ||
var x = 1; //переменная типа int | var x = 1; //переменная типа int | ||
Строка 22: | Строка 22: | ||
== className == | == className == | ||
− | '''Возвращает''': <tt>[[ | + | '''Возвращает''': <tt>[[string]]</tt><br> |
Эквивалент операции <tt>x.class.name</tt>, только работает быстрее (без создания промежуточного объекта) | Эквивалент операции <tt>x.class.name</tt>, только работает быстрее (без создания промежуточного объекта) | ||
Строка 28: | Строка 28: | ||
== instanceOf == | == instanceOf == | ||
− | instanceOf(''имя класса:'' <tt>[[ | + | instanceOf(''имя класса:'' <tt>[[string]]</tt>) <br> |
− | instanceOf(''класс:'' <tt>[[ | + | instanceOf(''класс:'' <tt>[[Class]]</tt>) <br> |
− | '''Возвращает''': [[ | + | '''Возвращает''': [[логическое значение]] <br> |
Проверяет, является ли текущий объект инстанцией указанного класса. | Проверяет, является ли текущий объект инстанцией указанного класса. | ||
Строка 36: | Строка 36: | ||
== call == | == call == | ||
− | call(''имя метода:'' <tt>[[ | + | call(''имя метода:'' <tt>[[string]]</tt>, <tt>'''...'''</tt>) <br> |
'''Возвращает''': динамическую переменную <br> | '''Возвращает''': динамическую переменную <br> | ||
− | Метод позволяет вызывать методы объектов динамически, по их имени. | + | Метод позволяет вызывать методы объектов динамически, по их имени. При этом, вызываемому методу передаются все последующие параметры (если таковые имеются). Естественно, никакой проверки типов фактических параметров не производится. Всю работу по приведению типов программист должен осуществлять сам. Пример: |
<source lang="kpp"> | <source lang="kpp"> | ||
var ary = new array; | var ary = new array; | ||
Строка 48: | Строка 48: | ||
== invoke == | == invoke == | ||
− | invoke(''имя метода:'' <tt>[[ | + | invoke(''имя метода:'' <tt>[[string]]</tt>, ''параметры:'' <tt>[[array]]</tt>) <br> |
'''Возвращает''': динамическую переменную <br> | '''Возвращает''': динамическую переменную <br> | ||
− | Метод аналогичен по смыслу методу [[#call|call]], за исключением того, что последующие параметры передаются в массиве. При вызове этот массив будет "развернут", как если бы все параметры были записаны через запятую: | + | Метод аналогичен по смыслу методу <tt>[[#call|call]]</tt>, за исключением того, что последующие параметры передаются в массиве. При вызове этот массив будет "развернут", как если бы все параметры были записаны через запятую: |
<source lang="kpp"> | <source lang="kpp"> | ||
var ary = new array; | var ary = new array; | ||
Строка 63: | Строка 63: | ||
Метод "замораживает" текущий объект, после чего он становится доступным только для чтения. Обратной операции не существует, так что разморозить однажды замороженный объект нельзя. | Метод "замораживает" текущий объект, после чего он становится доступным только для чтения. Обратной операции не существует, так что разморозить однажды замороженный объект нельзя. | ||
− | |||
− | |||
== frozen == | == frozen == | ||
− | '''Возвращает''': [[ | + | '''Возвращает''': [[логическое значение]] <br> |
Проверяет, является ли текущий объект замороженным. | Проверяет, является ли текущий объект замороженным. | ||
− | |||
− | |||
== clone == | == clone == | ||
Строка 89: | Строка 85: | ||
В этом примере, переменная ''copy'' будет содержать копию оригинального массива ''ary''. Однако скопирован будет только нулевой элемент массива, то есть объект соответствующий константе 5. Инстанция потока будет передана "как есть". | В этом примере, переменная ''copy'' будет содержать копию оригинального массива ''ary''. Однако скопирован будет только нулевой элемент массива, то есть объект соответствующий константе 5. Инстанция потока будет передана "как есть". | ||
+ | |||
+ | == dup == | ||
+ | |||
+ | |||
== inspect == | == inspect == | ||
− | '''Возвращает''': <tt>[[ | + | '''Возвращает''': <tt>[[string]]</tt> <br> |
− | Метод преобразует возвращает информацию об объекте в удобном для восприятия виде. Переопределяется в классах-потомках для отображения более детальной информации. Во многих случаях является аналогом оператора приведения к строке, однако не всегда. Например, в случае K++, для класса строки оператор приведения к типу [[ | + | Метод преобразует и возвращает информацию об объекте в удобном для восприятия виде. Переопределяется в классах-потомках для отображения более детальной информации. Во многих случаях является аналогом оператора приведения к строке, однако не всегда. Например, в случае K++, для класса строки оператор приведения к типу <tt>[[string]]</tt> возвращает саму строку, тогда как метод <tt>inspect</tt> возвращает строку с восстановленными спецсимволами и заключенную в кавычки: |
<source lang="kpp"> | <source lang="kpp"> | ||
var hello = "hello\tworld\n"; | var hello = "hello\tworld\n"; | ||
puts(hello); //вывод: hello world | puts(hello); //вывод: hello world | ||
− | puts(hello | + | puts(hello to string); //вывод: hello world |
puts(hello.inspect); //вывод: "hello\tworld\n" | puts(hello.inspect); //вывод: "hello\tworld\n" | ||
</source> | </source> | ||
− | Другие классы, такие как контейнеры переопределяют метод для отображения своего содержимого. При этом, в коде метода рекурсивно | + | Другие классы, такие как контейнеры, переопределяют метод для отображения своего содержимого. При этом, в коде метода рекурсивно вызывается метод <tt>inspect</tt> самих элементов для отображения их значения: |
<source lang="kpp"> | <source lang="kpp"> | ||
var ary = [1, [2,'3'], :x, { :a => 1 }]; | var ary = [1, [2,'3'], :x, { :a => 1 }]; | ||
Строка 110: | Строка 110: | ||
== equals == | == equals == | ||
− | equals(''объект сравнения | + | equals(''объект сравнения'') <br> |
− | '''Возвращает''': [[ | + | operator == (''объект сравнения'') <br> |
+ | '''Возвращает''': [[логическое значение]] <br> | ||
− | Метод используется для проверки объектов на идентичность. Возвращает истину только в том случае когда текущий объект и передный параметр — это один и тот же объект. Два объекта, с одинаковыми значениями все равно считаются | + | Метод используется для проверки объектов на идентичность. Возвращает истину только в том случае когда текущий объект и передный параметр — это один и тот же объект. Два различных объекта, пусть и с одинаковыми значениями, все равно '''не считаются''' идентичными: |
<source lang="kpp"> | <source lang="kpp"> | ||
Строка 128: | Строка 129: | ||
== hasMethod == | == hasMethod == | ||
− | hasMethod(''имя метода:'' <tt>[[ | + | hasMethod(''имя метода:'' <tt>[[string]]</tt>) <br> |
− | '''Возвращает''': [[ | + | '''Возвращает''': [[логическое значение]] <br> |
Проверяет, имеет ли объект указанный метод. | Проверяет, имеет ли объект указанный метод. | ||
Строка 135: | Строка 136: | ||
== getMethod == | == getMethod == | ||
− | getMethod(''имя метода:'' <tt>[[ | + | getMethod(''имя метода:'' <tt>[[string]]</tt>) <br> |
− | '''Возвращает''': <tt>[[ | + | '''Возвращает''': <tt>[[Method]]</tt> <br> |
− | Данный метод возвращает метод объекта в виде объекта метода =) Впоследствии, этот объект может использоваться для удаленного вызова метода, либо для получения дополнительной информации. При попытке получения несуществующего метода будет возбуждено исключение <tt>[[ENotFound|ENotFound]]</tt>. | + | Данный метод возвращает метод объекта в виде объекта метода =) Впоследствии, этот объект может использоваться для удаленного вызова метода, либо для получения дополнительной информации. При попытке получения несуществующего метода будет возбуждено исключение <tt>[[Классы исключений#ENotFound|ENotFound]]</tt>. |
Пример использования: | Пример использования: | ||
Строка 150: | Строка 151: | ||
== methods == | == methods == | ||
− | '''Возвращает''': <tt>[[ | + | '''Возвращает''': <tt>[[array]]<[[string]]></tt> <br> |
Метод возвращает массив имен методов. | Метод возвращает массив имен методов. | ||
'''Примечание:''' Результирующий массив создается по требованию при каждом вызове метода. Поэтому, при необходимости перебора элементов, следует сначала сохранить полученный массив в переменную, а затем работать уже с ней. | '''Примечание:''' Результирующий массив создается по требованию при каждом вызове метода. Поэтому, при необходимости перебора элементов, следует сначала сохранить полученный массив в переменную, а затем работать уже с ней. |
Текущая версия на 14:45, 12 сентября 2009
Класс Object является сердцем всей стандартной библиотеки и ее центральным классом. Все остальные классы, прямо или косвенно наследуются от Object, что позволяет реализовывать централизованное управление и сбор информации об объектах. Данный класс имеет набор методов которые реализуют механизм рефлексии, который заключается в том, что объекты могут динамически получать информацию о других объектах (включая самих себя). Например, объект A может узнать, какие методы имеет объект B, и на основании этой информации выполнять те или иные действия.
Класс Object вводит понятие инспектирования объектов, которое позволяет получать сведения о содержимом объектов в удобной для восприятия форме (это может быть особенно полезно при отладке и трассировке программ).
Родители: Object
Методы: class className instanceOf call invoke freeze frozen clone dup inspect equals hasMethod getMethod methods
Реализует операторы: ==
[править] class
Возвращает: Class
Метод возвращает инстанцию класса Class, соответствующую классу данного объекта. Например: <source lang="kpp"> var x = 1; //переменная типа int var c = x.class; //переменная типа Class puts(c.name); //выведет на экран строку "int" </source>
[править] className
Возвращает: string
Эквивалент операции x.class.name, только работает быстрее (без создания промежуточного объекта)
[править] instanceOf
instanceOf(имя класса: string)
instanceOf(класс: Class)
Возвращает: логическое значение
Проверяет, является ли текущий объект инстанцией указанного класса.
[править] call
call(имя метода: string, ...)
Возвращает: динамическую переменную
Метод позволяет вызывать методы объектов динамически, по их имени. При этом, вызываемому методу передаются все последующие параметры (если таковые имеются). Естественно, никакой проверки типов фактических параметров не производится. Всю работу по приведению типов программист должен осуществлять сам. Пример: <source lang="kpp"> var ary = new array; ary.call(:push, 1, 2, 3); puts(ary.inspect); // [1, 2, 3] </source>
[править] invoke
invoke(имя метода: string, параметры: array)
Возвращает: динамическую переменную
Метод аналогичен по смыслу методу call, за исключением того, что последующие параметры передаются в массиве. При вызове этот массив будет "развернут", как если бы все параметры были записаны через запятую: <source lang="kpp"> var ary = new array; ary.invoke(:push, [1, 2, 3]); puts(ary.inspect); // [1, 2, 3] </source>
[править] freeze
Возвращает: текущий объект
Метод "замораживает" текущий объект, после чего он становится доступным только для чтения. Обратной операции не существует, так что разморозить однажды замороженный объект нельзя.
[править] frozen
Возвращает: логическое значение
Проверяет, является ли текущий объект замороженным.
[править] clone
Возвращает: копию текущего объекта
Метод служит для создания копии текущего объекта, используя оператор "=". Если объект (или его класс) располагает таким методом, будет создана пустая инстанция класса, которой будет присвоено значение текущего объекта.
Примечание: В случае с контейнерами копирование происходит только в том случае, если данный элемент обладает оператором "="; в противном случае, в копии контейнера будет лежать тот же объект: <source lang="kpp"> var ary = new array; ary.push(5); ary.push(Stream.open(...)); var copy = ary.clone; </source>
В этом примере, переменная copy будет содержать копию оригинального массива ary. Однако скопирован будет только нулевой элемент массива, то есть объект соответствующий константе 5. Инстанция потока будет передана "как есть".
[править] dup
[править] inspect
Возвращает: string
Метод преобразует и возвращает информацию об объекте в удобном для восприятия виде. Переопределяется в классах-потомках для отображения более детальной информации. Во многих случаях является аналогом оператора приведения к строке, однако не всегда. Например, в случае K++, для класса строки оператор приведения к типу string возвращает саму строку, тогда как метод inspect возвращает строку с восстановленными спецсимволами и заключенную в кавычки: <source lang="kpp"> var hello = "hello\tworld\n"; puts(hello); //вывод: hello world puts(hello to string); //вывод: hello world puts(hello.inspect); //вывод: "hello\tworld\n" </source>
Другие классы, такие как контейнеры, переопределяют метод для отображения своего содержимого. При этом, в коде метода рекурсивно вызывается метод inspect самих элементов для отображения их значения: <source lang="kpp"> var ary = [1, [2,'3'], :x, { :a => 1 }]; puts(ary.inspect); //вывод: [1, [2, "3"], "x", { "a" => 1 }] </source>
[править] equals
equals(объект сравнения)
operator == (объект сравнения)
Возвращает: логическое значение
Метод используется для проверки объектов на идентичность. Возвращает истину только в том случае когда текущий объект и передный параметр — это один и тот же объект. Два различных объекта, пусть и с одинаковыми значениями, все равно не считаются идентичными:
<source lang="kpp"> var x = 5; var b1 = x.equals(x); var y = 4 + 1; var b2 = x.equals(y); </source>
В этом примере переменная b1 будет истинной, в то время как переменная b2 ложной. Несмотря на то, что переменные x и y равны численно — они представлены разными объектами.
Примечание: В случае с классом Object для тех же целей может применяться и оператор ==, однако предполагается что он должен переопределяться дочерними классами для достижения собственных целей. Сам же метод equals переопределяться не должен никогда (для обеспечения оригинального функционала).
[править] hasMethod
hasMethod(имя метода: string)
Возвращает: логическое значение
Проверяет, имеет ли объект указанный метод.
[править] getMethod
getMethod(имя метода: string)
Возвращает: Method
Данный метод возвращает метод объекта в виде объекта метода =) Впоследствии, этот объект может использоваться для удаленного вызова метода, либо для получения дополнительной информации. При попытке получения несуществующего метода будет возбуждено исключение ENotFound.
Пример использования: <source lang="kpp"> var ary = new array; var p = ary.getMethod(:push); p(1, 2, 3); ary.inspect; //значение: [1, 2, 3] </source>
[править] methods
Метод возвращает массив имен методов.
Примечание: Результирующий массив создается по требованию при каждом вызове метода. Поэтому, при необходимости перебора элементов, следует сначала сохранить полученный массив в переменную, а затем работать уже с ней.