Ruby/Справочник/Struct
Класс Struct
[править]Класс Struct реализует удобный способ объединения набора атрибутов, используя методы доступа, без явного создания класса. Класс Struct создает специфические классы, которые содержат только набор переменных и методы доступа к ним. В следующем примере мы создадим класс Customer и продемонстрируем пример использования объекта этого класса. В следующем описании, параметр symbol может быть строкой или экземпляром класса Symbol (например, :name).
Примеси
Enumerable (all?, any?, collect, detect, each_cons, each_slice, each_with_index, entries, enum_cons, enum_slice, enum_with_index, find, find_all, grep, group_by, include?, index_by, inject, map, max, member?, min, partition, reject, select, sort, sort_by, sum, to_a, to_set, zip)
Методы класса
Методы объекта
[]=, [], ==, each_pair, each, eql?, hash, inspect, length, members, select, size, to_a, to_s, values_at, values
Struct::new
[править]Struct.new( string, symbols* ) #-> StructClass
StructClass.new(arg, ...) #-> obj
StructClass[arg, ...] #-> obj
Создание нового класса с именем string, содержащего методы доступа к атрибутам. Если имя string пропущено, то будет создан анонимная структура. Иначе, имя этой структуры будет выглядеть как константа класса Struct. Учтите, что имя структуры должно быть уникально и начинаться с большой буквы. Struct::new возвращает объект класса Class, который может быть использован для создания специфичных экземпляров новой структуры. Число действительных параметров должно быть меньше или равно числу атрибутов, объявленных для этой структуры.
# Создание структуры с именем внутри класса Struct
Struct.new("Customer", :name, :address) #-> Struct::Customer
Struct::Customer.new("Dave", "123 Main") #-> #<Struct::Customer name="Dave", address="123 Main">
# Имя структуры зависит от имени константы
Customer = Struct.new(:name, :address) #-> Customer
Customer.new("Dave", "123 Main") #-> #<Customer name="Dave", address="123 Main">
Struct#==
[править]struct == other_struct #-> true или false
Эквивалентность --- возвращает true если other_struct равен : они должны быть объектами одного и того же класса, созданного при помощи Struct::new, и значения внутренних переменных должны совпадать (в соответствии с методом Object#==).
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joejr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345)
joe == joejr #-> true
joe == jane #-> false
Struct#[]
[править]struct[symbol] #-> anObject
struct[fixnum] #-> anObject
Значение атрибута можно получить, если передать в качестве параметра имя атрибута (в виде строки или символа) или числовой индекс в интервале (0..размер-1). Возникнет ошибка NameError, если имя атрибута отсутствует или IndexError, если числовой индекс будет лежать вне допустимого интервала.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe["name"] #-> "Joe Smith"
joe[:name] #-> "Joe Smith"
joe[0] #-> "Joe Smith"
Struct#[]=
[править]struct[symbol] = obj #-> obj
struct[fixnum] = obj #-> obj
Изменить значение атрибута можно передав в качестве параметра имя атрибута (в виде строки или символа) или целочисленный индекс в интервале (0..размер-1), а также объект obj, который надо присвоить атрибуту. Возникнет ошибка NameError, если имени атрибута не существует или IndexError, если целочисленный индекс будет лежать вне диапазона.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe["name"] = "Luke"
joe[:zip] = "90210"
joe.name #-> "Luke"
joe.zip #-> "90210"
Struct#each
[править]struct.each {|obj| block } #-> struct
Выполняет block по разу на каждый атрибут, передавая в блок его значение.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.each {|x| puts(x) }
результат:
Joe Smith 123 Maple, Anytown NC 12345
Struct#each_pair
[править]struct.each_pair {|sym, obj| block } #-> struct
Выполняет block по разу на каждый атрибут, передавая в блок имя (как символ) и значение параметра.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.each_pair {|name, value| puts("#{name} => #{value}") }
результат:
name => Joe Smith address => 123 Maple, Anytown NC zip => 12345
Struct#eql?
[править]struct.eql?(other) #-> true или false
Две структуры эквивалентны, если они являются одним и тем же объектом или если все их атрибуты эквиваленты (используется метод eql?).
Struct#hash
[править]struct.hash #-> fixnum
Возвращает контрольную сумму, основанную на контрольных суммах значений атрибутов.
Struct#inspect
[править]struct.to_s #-> string
struct.inspect #-> string
Демонстрирует содержимое структуры в виде строки.
(еще известен как to_s)
Struct#length
[править]struct.length #-> fixnum
struct.size #-> fixnum
Возвращает количество атрибутов структуры.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.length #-> 3
(еще известен как size)
Struct#members
[править]struct.members #-> array
Возвращает массив строк, состоящий из имен атрибутов структуры.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.members #-> ["name", "address", "zip"]
Struct#select
[править]struct.select {|i| block } #-> array
Выполняет блок для каждого значения атрибута в структуре, возвращает массив содержащий элементы для которых блок вернул значение true (эквивалент метода Enumerable#select).
Lots = Struct.new(:a, :b, :c, :d, :e, :f)
l = Lots.new(11, 22, 33, 44, 55, 66)
l.select {|v| (v % 2).zero? } #-> [22, 44, 66]
Struct#size
[править]struct.length #-> fixnum
struct.size #-> fixnum
Возвращает количество атрибутов структуры.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.length #-> 3
(еще известен как length :))
Struct#to_a
[править]struct.to_a #-> array
struct.values #-> array
Возвращает массив значений атрибутов структуры.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.to_a[1] #-> "123 Maple, Anytown NC"
(еще известен как values)
Struct#to_s
[править]struct.to_s #-> string
struct.inspect #-> string
Демонстрирует содержимое структуры в виде строки.
(еще известен как inspect)
Struct#values
[править]struct.to_a #-> array
struct.values #-> array
Возвращает массив значений атрибутов структуры.
Customer = Struct.new(:name, :address, :zip)
joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
joe.to_a[1] #-> "123 Maple, Anytown NC"
(еще известен как to_a)
Struct#values_at
[править]struct.values_at(selector,... ) #-> an_array
Возвращает массив, состоящий из значений элементов, индексы которых переданы в качестве параметров. Индексы могут быть целым числом или целочисленным интервалом. Смотри также select.
a = %w{ a b c d e f }
a.values_at(1, 3, 5)
a.values_at(1, 3, 5, 7)
a.values_at(-1, -3, -5, -7)
a.values_at(1..3, 2...5)