Перейти к содержанию

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)

Методы класса

new

Методы объекта

[]=, [], ==, 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)