Spec-Zone.ru › Ruby on Rails 8.1

класс Hash

Родительский класс:
Object

Публичные методы класса

from_trusted_xml (xml) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/conversions.rb, line 133
def from_trusted_xml(xml)
  from_xml xml, []
end

Создает Hash из XML так же, как Hash.from_xml, но также разрешает Symbol и YAML.

from_xml (xml, disallowed_types = nil) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/conversions.rb, line 128
def from_xml(xml, disallowed_types = nil)
  ActiveSupport::XMLConverter.new(xml, disallowed_types).to_h
end

Возвращает Hash, содержащий коллекцию пар, в которых ключом является имя узла, а значением — его содержимое

xml = <<-XML
  <?xml version="1.0" encoding="UTF-8"?>
    <hash>
      <foo type="integer">1</foo>
      <bar type="integer">2</bar>
    </hash>
XML

hash = Hash.from_xml(xml)
# => {"hash"=>{"foo"=>1, "bar"=>2}}

Вызывается DisallowedType, если XML содержит атрибуты с type="yaml" или type="symbol". Используйте Hash.from_trusted_xml для разбора этого XML.

Пользовательские disallowed_types также можно передать в виде массива.

xml = <<-XML
  <?xml version="1.0" encoding="UTF-8"?>
    <hash>
      <foo type="integer">1</foo>
      <bar type="string">"David"</bar>
    </hash>
XML

hash = Hash.from_xml(xml, ['integer'])
# => ActiveSupport::XMLConverter::DisallowedType: Disallowed type attribute: "integer"

Обратите внимание: передача пользовательских запрещенных типов переопределяет типы по умолчанию — Symbol и YAML.

Публичные методы экземпляра

assert_valid_keys (*valid_keys) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 48
def assert_valid_keys(*valid_keys)
  valid_keys.flatten!
  each_key do |k|
    unless valid_keys.include?(k)
      raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}")
    end
  end
end

Проверяет, что все ключи хеша соответствуют *valid_keys, и при несовпадении вызывает ArgumentError.

Обратите внимание: ключи обрабатываются иначе, чем в HashWithIndifferentAccess, поэтому строковые ключи и ключи-символы не совпадают.

{ name: 'Rob', years: '28' }.assert_valid_keys(:name, :age) # => raises "ArgumentError: Unknown key: :years. Valid keys are: :name, :age"
{ name: 'Rob', age: '28' }.assert_valid_keys('name', 'age') # => raises "ArgumentError: Unknown key: :name. Valid keys are: 'name', 'age'"
{ name: 'Rob', age: '28' }.assert_valid_keys(:name, :age)   # => passes, raises nothing
compact_blank! () Показать исходный код
# File activesupport/lib/active_support/core_ext/enumerable.rb, line 244
def compact_blank!
  # use delete_if rather than reject! because it always returns self even if nothing changed
  delete_if { |_k, v| v.blank? }
end

Удаляет все пустые значения из Hash на месте и возвращает сам объект. Для определения пустого значения используется Object#blank?.

h = { a: "", b: 1, c: nil, d: [], e: false, f: true }
h.compact_blank!
# => { b: 1, f: true }
deep_dup () Показать исходный код
# File activesupport/lib/active_support/core_ext/object/deep_dup.rb, line 43
def deep_dup
  hash = dup
  each_pair do |key, value|
    if ::String === key || ::Symbol === key
      hash[key] = value.deep_dup
    else
      hash.delete(key)
      hash[key.deep_dup] = value.deep_dup
    end
  end
  hash
end

Возвращает глубокую копию хеша.

hash = { a: { b: 'b' } }
dup  = hash.deep_dup
dup[:a][:c] = 'c'

hash[:a][:c] # => nil
dup[:a][:c]  # => "c"
deep_merge(other_hash, &block) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/deep_merge.rb, line 9
  

Возвращает новый хеш, в котором self и other_hash объединены рекурсивно.

h1 = { a: true, b: { c: [1, 2, 3] } }
h2 = { a: false, b: { x: [3, 4, 5] } }

h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }

Как и в случае с Hash#merge из стандартной библиотеки, для объединения значений можно передать блок:

h1 = { a: 100, b: 200, c: { c1: 100 } }
h2 = { b: 250, c: { c1: 200 } }
h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val }
# => { a: 100, b: 450, c: { c1: 300 } }
deep_merge!(other_hash, &block) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/deep_merge.rb, line 31
  

То же, что и deep_merge, но изменяет self.

deep_stringify_keys () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 84
def deep_stringify_keys
  deep_transform_keys { |k| Symbol === k ? k.name : k.to_s }
end

Возвращает новый хеш, в котором все ключи преобразованы в строки. Это относится к ключам корневого хеша, а также всех вложенных хешей и массивов.

hash = { person: { name: 'Rob', age: '28' } }

hash.deep_stringify_keys
# => {"person"=>{"name"=>"Rob", "age"=>"28"}}
deep_stringify_keys! () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 91
def deep_stringify_keys!
  deep_transform_keys! { |k| Symbol === k ? k.name : k.to_s }
end

На месте преобразует все ключи в строки. Это относится к ключам корневого хеша, а также всех вложенных хешей и массивов.

deep_symbolize_keys () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 103
def deep_symbolize_keys
  deep_transform_keys { |key| key.to_sym rescue key }
end

Возвращает новый хеш, в котором все ключи преобразованы в символы, если они поддерживают to_sym. Это относится к ключам корневого хеша, а также всех вложенных хешей и массивов.

hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } }

hash.deep_symbolize_keys
# => {:person=>{:name=>"Rob", :age=>"28"}}
deep_symbolize_keys! () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 110
def deep_symbolize_keys!
  deep_transform_keys! { |key| key.to_sym rescue key }
end

На месте преобразует все ключи в символы, если они поддерживают to_sym. Это относится к ключам корневого хеша, а также всех вложенных хешей и массивов.

deep_transform_keys (&block) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 65
def deep_transform_keys(&block)
  _deep_transform_keys_in_object(self, &block)
end

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

hash = { person: { name: 'Rob', age: '28' } }

hash.deep_transform_keys{ |key| key.to_s.upcase }
# => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}}
deep_transform_keys! (&block) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 72
def deep_transform_keys!(&block)
  _deep_transform_keys_in_object!(self, &block)
end

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

deep_transform_values (&block) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/deep_transform_values.rb, line 12
def deep_transform_values(&block)
  _deep_transform_values_in_object(self, &block)
end

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

hash = { person: { name: 'Rob', age: '28' } }

hash.deep_transform_values{ |value| value.to_s.upcase }
# => {person: {name: "ROB", age: "28"}}
deep_transform_values! (&block) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/deep_transform_values.rb, line 19
def deep_transform_values!(&block)
  _deep_transform_values_in_object!(self, &block)
end

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

except! (*keys) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/except.rb, line 8
def except!(*keys)
  keys.each { |key| delete(key) }
  self
end

Удаляет указанные ключи из хеша и возвращает его.

hash = { a: true, b: false, c: nil }
hash.except!(:c) # => { a: true, b: false }
hash             # => { a: true, b: false }
extract! (*keys) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/slice.rb, line 24
def extract!(*keys)
  keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
end

Удаляет и возвращает пары ключ/значение, соответствующие указанным ключам.

hash = { a: 1, b: 2, c: 3, d: 4 }
hash.extract!(:a, :b) # => {:a=>1, :b=>2}
hash                  # => {:c=>3, :d=>4}
extractable_options? () Показать исходный код
# File activesupport/lib/active_support/core_ext/array/extract_options.rb, line 9
def extractable_options?
  instance_of?(Hash)
end

По умолчанию извлекать можно только экземпляры самого класса Hash. Подклассы Hash могут реализовать этот метод и вернуть true, чтобы объявить себя извлекаемыми. Если Hash можно извлечь, Array#extract_options! извлекает его из Array, если он является последним элементом Array.

nested_under_indifferent_access ()

Вызывается, когда объект вложен в другой объект, получающий with_indifferent_access. Этот метод вызывается для текущего объекта внешним объектом и по умолчанию является псевдонимом with_indifferent_access. Подклассы Hash могут переопределить этот метод и вернуть self, если преобразование в ActiveSupport::HashWithIndifferentAccess нежелательно.

b = { b: 1 }
{ a: b }.with_indifferent_access['a'] # calls b.nested_under_indifferent_access
# => {"b"=>1}
Псевдоним для: with_indifferent_access
reverse_merge (other_hash) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/reverse_merge.rb, line 14
def reverse_merge(other_hash)
  other_hash.merge(self)
end

Объединяет вызывающий объект с other_hash. Например:

options = options.reverse_merge(size: 25, velocity: 10)

эквивалентно

options = { size: 25, velocity: 10 }.merge(options)

Это особенно полезно для инициализации хеша параметров значениями по умолчанию.

Также имеет псевдоним: with_defaults
reverse_merge! (other_hash) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/reverse_merge.rb, line 20
def reverse_merge!(other_hash)
  replace(reverse_merge(other_hash))
end

Разрушающий вариант reverse_merge.

Также имеет псевдонимы: reverse_update, with_defaults!
reverse_update (other_hash)
Псевдоним для: reverse_merge!
slice! (*keys) Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/slice.rb, line 10
def slice!(*keys)
  omit = slice(*self.keys - keys)
  hash = slice(*keys)
  hash.default      = default
  hash.default_proc = default_proc if default_proc
  replace(hash)
  omit
end

Заменяет хеш, оставляя в нем только указанные ключи. Возвращает хеш с удаленными парами ключ/значение.

hash = { a: 1, b: 2, c: 3, d: 4 }
hash.slice!(:a, :b)  # => {:c=>3, :d=>4}
hash                 # => {:a=>1, :b=>2}
stringify_keys () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 10
def stringify_keys
  transform_keys { |k| Symbol === k ? k.name : k.to_s }
end

Возвращает новый хеш, в котором все ключи преобразованы в строки.

hash = { name: 'Rob', age: '28' }

hash.stringify_keys
# => {"name"=>"Rob", "age"=>"28"}
stringify_keys! () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 16
def stringify_keys!
  transform_keys! { |k| Symbol === k ? k.name : k.to_s }
end

На месте преобразует все ключи в строки. То же, что и stringify_keys, но изменяет self.

symbolize_keys () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 27
def symbolize_keys
  transform_keys { |key| key.to_sym rescue key }
end

Возвращает новый хеш, в котором все ключи преобразованы в символы, если они поддерживают to_sym.

hash = { 'name' => 'Rob', 'age' => '28' }

hash.symbolize_keys
# => {:name=>"Rob", :age=>"28"}
Также имеет псевдоним: to_options
symbolize_keys! () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/keys.rb, line 34
def symbolize_keys!
  transform_keys! { |key| key.to_sym rescue key }
end

На месте преобразует все ключи в символы, если они поддерживают to_sym. То же, что и symbolize_keys, но изменяет self.

Также имеет псевдоним: to_options!
to_options ()
Псевдоним для: symbolize_keys
to_options! ()
Псевдоним для: symbolize_keys!
to_param (namespace = nil)
Псевдоним для: to_query
to_query (namespace = nil) Показать исходный код
# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 81
def to_query(namespace = nil)
  query = filter_map do |key, value|
    unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty?
      value.to_query(namespace ? "#{namespace}[#{key}]" : key)
    end
  end

  query.sort! unless namespace.to_s.include?("[]")
  query.join("&")
end

Возвращает строковое представление вызывающего объекта, пригодное для использования в строке запроса URL:

{name: 'David', nationality: 'Danish'}.to_query
# => "name=David&nationality=Danish"

Для заключения имен ключей можно передать необязательное пространство имен:

{name: 'David', nationality: 'Danish'}.to_query('user')
# => "user%5Bname%5D=David&user%5Bnationality%5D=Danish"

Строковые пары «key=value», составляющие строку запроса, сортируются по возрастанию в лексикографическом порядке.

Также имеет псевдоним: to_param
to_xml (options = {}) { |builder| ... } Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/conversions.rb, line 74
def to_xml(options = {})
  require "active_support/builder" unless defined?(Builder::XmlMarkup)

  options = options.dup
  options[:indent]  ||= 2
  options[:root]    ||= "hash"
  options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent])

  builder = options[:builder]
  builder.instruct! unless options.delete(:skip_instruct)

  root = ActiveSupport::XmlMini.rename_key(options[:root].to_s, options)

  builder.tag!(root) do
    each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) }
    yield builder if block_given?
  end
end

Возвращает строку, содержащую XML-представление вызывающего объекта:

{ foo: 1, bar: 2 }.to_xml
# =>
# <?xml version="1.0" encoding="UTF-8"?>
# <hash>
#   <foo type="integer">1</foo>
#   <bar type="integer">2</bar>
# </hash>

Для этого метод перебирает пары и создает узлы в зависимости от значений. Для пары key, value:

  • Если value — хеш, выполняется рекурсивный вызов, где key передается как :root.

  • Если value — массив, выполняется рекурсивный вызов, где key передается как :root, а key приводится к единственному числу как :children.

  • Если value — вызываемый объект, он должен принимать один или два аргумента. В зависимости от арности вызываемый объект получает хеш options в качестве первого аргумента с key в роли :root, а key, приведенное к единственному числу, — в качестве второго аргумента. Вызываемый объект может добавлять узлы с помощью options[:builder].

    {foo: lambda { |options, key| options[:builder].b(key) }}.to_xml
    # => "<b>foo</b>"
    
  • Если value поддерживает to_xml, метод вызывается с key в качестве :root.

    class Foo
      def to_xml(options)
        options[:builder].bar 'fooing!'
      end
    end
    
    { foo: Foo.new }.to_xml(skip_instruct: true)
    # =>
    # <hash>
    #   <bar>fooing!</bar>
    # </hash>
    
  • В противном случае создается узел с тегом key и строковым представлением value в качестве текстового узла. Если value равен nil, добавляется атрибут «nil» со значением «true». Если параметр :skip_types не задан или имеет значение false, также добавляется атрибут «type» согласно следующему соответствию:

    XML_TYPE_NAMES = {
      "Symbol"     => "symbol",
      "Integer"    => "integer",
      "BigDecimal" => "decimal",
      "Float"      => "float",
      "TrueClass"  => "boolean",
      "FalseClass" => "boolean",
      "Date"       => "date",
      "DateTime"   => "dateTime",
      "Time"       => "dateTime"
    }
    

По умолчанию корневой узел называется «hash», но это можно настроить с помощью параметра :root.

По умолчанию используется новый экземпляр XML-конструктора Builder::XmlMarkup. Вы можете настроить собственный конструктор с помощью параметра :builder. Метод также принимает такие параметры, как :dasherize и подобные им; они передаются конструктору.

with_defaults (other_hash)
Псевдоним для: reverse_merge
with_defaults! (other_hash)
Псевдоним для: reverse_merge!
with_indifferent_access () Показать исходный код
# File activesupport/lib/active_support/core_ext/hash/indifferent_access.rb, line 9
def with_indifferent_access
  ActiveSupport::HashWithIndifferentAccess.new(self)
end

Возвращает ActiveSupport::HashWithIndifferentAccess, созданный из вызывающего объекта:

{ a: 1 }.with_indifferent_access['a'] # => 1
Также имеет псевдоним: nested_under_indifferent_access

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API