Spec-Zone.ru › Ruby on Rails 4.1

класс Object

Родитель:
BasicObject
Включенные модули:

Константы

HashWithIndifferentAccess

Реализует хэш, где ключи :foo и "foo" считаются одинаковыми.

rgb = ActiveSupport::HashWithIndifferentAccess.new

rgb[:black] = '#000000'
rgb[:black]  # => '#000000'
rgb['black'] # => '#000000'

rgb['white'] = '#FFFFFF'
rgb[:white]  # => '#FFFFFF'
rgb['white'] # => '#FFFFFF'

Внутри символы отображаются в строки при использовании в качестве ключей во всем интерфейсе написания (вызывая []=, merge, и т.д.). Это отображение относится к общедоступному интерфейсу. Например, при:

hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1)

Вам гарантируется, что ключ будет возвращен в виде строки:

hash.keys # => ["a"]

Технически принимаются и другие типы ключей:

hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1)
hash[0] = 0
hash # => {"a"=>1, 0=>0}

но этот класс предназначен для случаев, когда ожидаемыми ключами являются строки или символы, и удобно понимать их как одинаковые. Например, хэш params в Ruby on Rails.

Обратите внимание, что ядро расширений определяет Hash#with_indifferent_access:

rgb = { black: '#000000', white: '#FFFFFF' }.with_indifferent_access

что может быть полезно.

MissingSourceFile

Общедоступные методы экземпляров

acts_like?(duck) Показать исходный код

Метод-помощник для типизации по уткам. Например, Active Support расширяет Date для определения метода acts_like_date?, а Time — для определения acts_like_time?. В результате, мы можем использовать x.acts_like?(:time) и x.acts_like?(:date) для безопасного сравнения по типизации по уткам, поскольку классы, которые мы хотим заставить действовать как Time, просто должны определить метод acts_like_time?.

# File activesupport/lib/active_support/core_ext/object/acts_like.rb, line 7
def acts_like?(duck)
  respond_to? :"acts_like_#{duck}?"
end
blank?() Показать исходный код

Объект считается пустым, если он ложный, пустой или строка из пробельных символов. Например, '', ' ', nil, [], и {} все являются пустыми.

Это упрощает

address.nil? || address.empty?

до

address.blank?

@return [true, false]

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 15
def blank?
  respond_to?(:empty?) ? !!empty? : !self
end
create_fixtures(*fixture_set_names, &block) Показать исходный код
# File railties/lib/rails/test_help.rb, line 28
def create_fixtures(*fixture_set_names, &block)
  FixtureSet.create_fixtures(ActiveSupport::TestCase.fixture_path, fixture_set_names, {}, &block)
end
deep_dup() Показать исходный код

Возвращает глубокую копию объекта, если он дублируемый. Если он не дублируемый, возвращает self.

object = Object.new
dup    = object.deep_dup
dup.instance_variable_set(:@a, 1)

object.instance_variable_defined?(:@a) # => false
dup.instance_variable_defined?(:@a)    # => true
# File activesupport/lib/active_support/core_ext/object/deep_dup.rb, line 13
def deep_dup
  duplicable? ? dup : self
end
duplicable?() Показать исходный код

Можно ли безопасно продублировать этот объект?

Ложь для nil, false, true, символов и числовых объектов; иначе истина.

# File activesupport/lib/active_support/core_ext/object/duplicable.rb, line 24
def duplicable?
  true
end
html_safe?() Показать исходный код
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 112
def html_safe?
  false
end
in?(another_object) Показать исходный код

Возвращает true, если этот объект включён в аргумент. Аргумент должен быть любым объектом, который отвечает на #include?. Использование:

characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true

Это вызовет ArgumentError, если аргумент не отвечает на #include?.

# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 10
def in?(another_object)
  another_object.include?(self)
rescue NoMethodError
  raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
end
instance_values() Показать исходный код

Возвращает словарь со строковыми ключами, который сопоставляет имена переменных экземпляра без “@” с соответствующими значениями.

class C
  def initialize(x, y)
    @x, @y = x, y
  end
end

C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 12
def instance_values
  Hash[instance_variables.map { |name| [name[1..-1], instance_variable_get(name)] }]
end
instance_variable_names() Показать исходный код

Возвращает массив имён переменных экземпляра в виде строк, включая “@”.

class C
  def initialize(x, y)
    @x, @y = x, y
  end
end

C.new(0, 1).instance_variable_names # => ["@y", "@x"]
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 25
def instance_variable_names
  instance_variables.map { |var| var.to_s }
end
presence() Показать исходный код

Возвращает получателя, если он присутствует, в противном случае возвращает nil. object.presence эквивалентно

object.present? ? object : nil

Например, что-то вроде

state   = params[:state]   if params[:state].present?
country = params[:country] if params[:country].present?
region  = state || country || 'US'

становится

region = params[:state].presence || params[:country].presence || 'US'

@return [Object]

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 42
def presence
  self if present?
end
presence_in(another_object) Показать исходный код

Возвращает получателя, если он включен в аргумент, в противном случае возвращает nil. Аргумент должен быть любым объектом, который отвечает на #include?. Использование:

params[:bucket_type].presence_in %w( project calendar )

Это вызовет ArgumentError, если аргумент не отвечает на #include?.

@return [Object]

# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 24
def presence_in(another_object)
  self.in?(another_object) ? self : nil
end
present?() Показать исходный код

Объект присутствует, если он не пуст.

@return [true, false]

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 22
def present?
  !blank?
end
to_json_with_active_support_encoder(options = nil) Показать исходный код
# File activesupport/lib/active_support/core_ext/object/json.rb, line 31
def to_json_with_active_support_encoder(options = nil)
  if options.is_a?(::JSON::State)
    # Called from JSON.{generate,dump}, forward it to JSON gem's to_json
    self.to_json_without_active_support_encoder(options)
  else
    # to_json is being invoked directly, use ActiveSupport's encoder
    ActiveSupport::JSON.encode(self, options)
  end
end
to_param() Показать исходный код

Псевдоним to_s.

# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 3
def to_param
  to_s
end
to_query(key) Показать исходный код

Преобразует объект в строку, пригодную для использования в строке запроса URL, используя указанное key в качестве имени параметра.

# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 9
def to_query(key)
  require 'cgi' unless defined?(CGI) && defined?(CGI::escape)
  "#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}"
end
try(*a) { |self| ... } Показать исходный код

Вызывает общедоступный метод, имя которого передаётся в качестве первого аргумента, так же как это делает public_send, за исключением того, что если получатель не отвечает на него, вызов возвращает nil, а не генерирует исключение.

Этот метод определён для того, чтобы можно было писать

@person.try(:name)

вместо

@person ? @person.name : nil

try возвращает nil при вызове на nil независимо от того, отвечает ли он на метод:

nil.try(:to_i) # => nil, rather than 0

Аргументы и блоки передаются методу при вызове:

@posts.try(:each_slice, 2) do |a, b|
  ...
end

Количество аргументов в сигнатуре должно совпадать. Если объект отвечает на метод, вызов выполняется, и ArgumentError всё ещё генерируется в противном случае.

Если try вызывается без аргументов, оно передает получателя в предоставленный блок, если это не nil:

@person.try do |p|
  ...
end

Обратите также внимание, что try определено для Object, поэтому он не будет работать с экземплярами классов, которые не имеют Object среди своих предков, например, с прямыми подклассами BasicObject. Например, использование try с SimpleDelegator делегирует try целевому объекту вместо вызова на самом делегирующем объекте.

# File activesupport/lib/active_support/core_ext/object/try.rb, line 41
def try(*a, &b)
  if a.empty? && block_given?
    yield self
  else
    public_send(*a, &b) if respond_to?(a.first)
  end
end
try!(*a) { |self| ... } Показать исходный код

То же самое, что и try, но при этом будет выброшено исключение NoMethodError, если получатель не равен nil и не реализует вызванный метод.

# File activesupport/lib/active_support/core_ext/object/try.rb, line 51
def try!(*a, &b)
  if a.empty? && block_given?
    yield self
  else
    public_send(*a, &b)
  end
end
unescape(str, escaped = /%[a-fA-F\d]{2}/) Показать исходный код
# File activesupport/lib/active_support/core_ext/uri.rb, line 9
def unescape(str, escaped = /%[a-fA-F\d]{2}/)
  # TODO: Are we actually sure that ASCII == UTF-8?
  # YK: My initial experiments say yes, but let's be sure please
  enc = str.encoding
  enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
  str.gsub(escaped) { [$&[1, 2].hex].pack('C') }.force_encoding(enc)
end
with_options(options) { |option_merger| ... } Показать исходный код

Элегантный способ вынести дублирование из опций, передаваемых в серию вызовов методов. Каждый метод, вызываемый в блоке, с переменной блока в качестве получателя, будет иметь свои опции, объединённые со стандартным options словарем, предоставленным. Каждый вызов метода для переменной блока должен принимать словарь опций в качестве последнего аргумента.

Без with_options>, этот код содержит дублирование:

class Account < ActiveRecord::Base
  has_many :customers, dependent: :destroy
  has_many :products,  dependent: :destroy
  has_many :invoices,  dependent: :destroy
  has_many :expenses,  dependent: :destroy
end

Используя with_options, мы можем убрать дублирование:

class Account < ActiveRecord::Base
  with_options dependent: :destroy do |assoc|
    assoc.has_many :customers
    assoc.has_many :products
    assoc.has_many :invoices
    assoc.has_many :expenses
  end
end

Его также можно использовать с явным получателем:

I18n.with_options locale: user.locale, scope: 'newsletter' do |i18n|
  subject i18n.t :subject
  body    i18n.t :body, user_name: user.name
end

with_options также может быть вложен, так как вызов передаётся его получателю. Каждый уровень вложения объединяет унаследованные значения по умолчанию в дополнение к своим собственным.

# File activesupport/lib/active_support/core_ext/object/with_options.rb, line 39
def with_options(options)
  yield ActiveSupport::OptionMerger.new(self, options)
end

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

Spec-Zone.ru

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