Spec-Zone.ru › Ruby 3.1

класс Объект

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

Object является корневым объектом всех Ruby-объектов. Object наследуется от BasicObject, что позволяет создавать альтернативные иерархии объектов. Методы класса Object доступны для всех классов, если явно не переопределены.

Object включает модуль Kernel, делая встроенные функции ядра глобально доступными. Несмотря на то, что методы экземпляров Object определяются модулем Kernel, мы решили документировать их здесь для ясности.

При обращении к константам в классах, наследуемых от Object, вам не нужно использовать полное пространство имён. Например, обращение к File внутри YourClass найдёт верхнеуровневый класс File.

В описаниях методов объекта, параметр символ относится к символу, который может быть строкой в кавычках или Symbol (например, :name).

Что здесь?

Сначала, что где-то ещё. Класс Object:

  • Наследуется от класса BasicObject.

  • Включает модуль Kernel.

Здесь класс Object предоставляет методы для:

  • Запроса

  • Переменных экземпляра

  • Других операций

Запросы

  • !~

    Возвращает true , если self не совпадает с заданным объектом, в противном случае false.

  • <=>

    Возвращает 0, если self и заданный объект object являются одним и тем же объектом, или если self == object; в противном случае возвращает nil.

  • ===

    Реализует равенство по типу, фактически то же самое, что вызов ==.

  • eql?

    Реализует равенство по хэшу, фактически то же самое, что вызов ==.

  • kind_of? (алиас is_a?)

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

  • instance_of?

    Возвращает, является ли self экземпляром данного класса.

  • instance_variable_defined?

    Возвращает, определена ли данная переменная экземпляра в self.

  • method

    Возвращает объект Method для данного метода в self.

  • methods

    Возвращает массив имён символов общедоступных и защищённых методов в self.

  • nil?

    Возвращает false. (Только nil отвечает true на метод nil?.)

  • object_id

    Возвращает целое число, соответствующее self, уникальное для текущего процесса.

  • private_methods

    Возвращает массив имён символов приватных методов в self.

  • protected_methods

    Возвращает массив имён символов защищённых методов в self.

  • public_method

    Возвращает объект Method для данного общедоступного метода в self.

  • public_methods

    Возвращает массив имён символов общедоступных методов в self.

  • respond_to?

    Возвращает, отвечает ли self на данный метод.

  • singleton_class

    Возвращает единственный класс self.

  • singleton_method

    Возвращает объект Method для данного единственного метода в self.

  • singleton_methods

    Возвращает массив имён символов единственных методов в self.

  • define_singleton_method

    Определяет единственный метод в self для данного метода-символа и блока или проса.

  • extend

    Включает заданные модули в единственный класс self.

  • public_send

    Вызывает данный общедоступный метод в self с заданным аргументом.

  • send

    Вызывает данный метод в self с заданным аргументом.

Переменные экземпляра

  • instance_variable_get

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

  • instance_variable_set

    Устанавливает значение заданной переменной экземпляра в self в заданный объект.

  • instance_variables

    Возвращает массив имён символов переменных экземпляра в self.

  • remove_instance_variable

    Удаляет указанную переменную экземпляра из self.

Другие методы

  • clone

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

  • define_singleton_method

    Определяет единственный метод в self для данного метода-символа и блока или проса.

  • display

    Выводит self в указанный поток ввода-вывода или $stdout.

  • dup

    Возвращает поверхностную неотмороженную копию self.

  • enum_for (алиас to_enum)

    Возвращает Enumerator для self с использованием заданного метода, аргументов и блока.

  • extend

    Включает заданные модули в единственный класс self.

  • freeze

    Запрещает дальнейшие изменения в self.

  • hash

    Возвращает целое число хэш-значение для self.

  • inspect

    Возвращает удобочитаемую строку представления self.

  • itself

    Возвращает self.

  • public_send

    Вызывает данный общедоступный метод в self с заданным аргументом.

  • send

    Вызывает данный метод в self с заданным аргументом.

  • to_s

    Возвращает строковое представление self.

Константы

ARGF

ARGF — это поток, предназначенный для использования в скриптах, которые обрабатывают файлы, переданные в качестве аргументов командной строки или через STDIN.

Дополнительные сведения см. в ARGF (классе).

ARGV

ARGV содержит аргументы командной строки, используемые для запуска ruby.

Для обработки аргументов командной строки можно использовать библиотеку, такую как OptionParser.

Bignum

Устаревший класс, используйте Integer

CROSS_COMPILING
DATA

DATA — это File, содержащий раздел данных исполняемого файла. Для создания раздела данных используйте __END__:

$ cat t.rb
puts DATA.gets
__END__
hello world!

$ ruby t.rb
hello world!
ENV

ENV — это объект типа Hash для доступа к переменным среды.

Дополнительные сведения см. в ENV (классе).

Fixnum

Устаревший класс, используйте Integer

ParseError
RUBY_COPYRIGHT

Строка авторских прав для ruby

RUBY_DESCRIPTION

Полная строка версии ruby, например, та, что печатается при вызове ruby -v

RUBY_ENGINE

Интерпретатор, используемый данным ruby.

RUBY_ENGINE_VERSION

Версия используемого интерпретатора.

RUBY_PATCHLEVEL

Значение patchlevel для данного ruby. Если это тестовая сборка ruby, patchlevel будет равен -1

RUBY_PLATFORM

Платформа для данного ruby

RUBY_RELEASE_DATE

Дата выпуска данного ruby

RUBY_REVISION

Хэш коммита GIT для данного ruby.

RUBY_VERSION

Запущенная версия ruby

Readline
SCRIPT_LINES__

При присваивании Hash к SCRIPT_LINES__ содержимое файлов, загруженных после присваивания, будет добавлено как Array строк с именем файла в качестве ключа.

STDERR

Содержит исходный STDERR

STDIN

Содержит исходный STDIN

STDOUT

Содержит исходный STDOUT

TOPLEVEL_BINDING

Binding верхнего уровня области видимости

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

yaml_tag(url) Показать исходный код
# File ext/psych/lib/psych/core_ext.rb, line 3
def self.yaml_tag url
  Psych.add_tag(url, self)
end

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

obj !~ other → true или false Показать исходный код
static VALUE
rb_obj_not_match(VALUE obj1, VALUE obj2)
{
    VALUE result = rb_funcall(obj1, id_match, 1, obj2);
    return RTEST(result) ? Qfalse : Qtrue;
}

Возвращает true, если два объекта не совпадают (используя метод =~), в противном случае — false.

obj <=> other → 0 или nil Показать исходный код
static VALUE
rb_obj_cmp(VALUE obj1, VALUE obj2)
{
    if (rb_equal(obj1, obj2))
        return INT2FIX(0);
    return Qnil;
}

Возвращает 0, если obj и other являются одним и тем же объектом или obj == other, в противном случае — nil.

Оператор #<=> используется различными методами для сравнения объектов, например, Enumerable#sort, Enumerable#max и т.д.

Ваша реализация метода #<=> должна возвращать одно из следующих значений: -1, 0, 1 или nil. -1 означает, что self меньше other. 0 означает, что self равен other. 1 означает, что self больше other. Nil означает, что два значения нельзя сравнить.

При определении метода #<=>, вы можете использовать Comparable, чтобы получить методы #<=, #<, ==, #>=, #> и between?.

obj === other → true или false Показать исходный код
#define case_equal rb_equal

Сравнение по типу — для класса Object, фактически эквивалентно вызову #==, но обычно переопределяется потомками, чтобы обеспечить осмысленные семантику в case операторах.

obj =~ other → nil Показать исходный код
static VALUE
rb_obj_match(VALUE obj1, VALUE obj2)
{
    if (rb_warning_category_enabled_p(RB_WARN_CATEGORY_DEPRECATED)) {
        rb_category_warn(RB_WARN_CATEGORY_DEPRECATED, "deprecated Object#=~ is called on %"PRIsVALUE
                "; it always returns nil", rb_obj_class(obj1));
    }
    return Qnil;
}

Этот метод устарел.

Он не только бесполезен, но и проблематичен, так как может скрыть ошибку типа.

CSV(*args, **options, &block) Показать исходный код
# File lib/csv.rb, line 2680
def CSV(*args, **options, &block)
  CSV.instance(*args, **options, &block)
end

Передает args в CSV::instance.

CSV("CSV,data").read
  #=> [["CSV", "data"]]

Если задан блок, экземпляр передается блоку, и возвращаемое значение становится возвращаемым значением блока.

CSV("CSV,data") { |c|
  c.read.any? { |a| a.include?("data") }
} #=> true

CSV("CSV,data") { |c|
  c.read.any? { |a| a.include?("zombies") }
} #=> false

CSV параметры также могут быть указаны.

io = StringIO.new
CSV(io, col_sep: ";") { |csv| csv << ["a", "b", "c"] }

Этот API не является Ractor-безопасным.

DelegateClass(superclass, &block) Показать исходный код
# File lib/delegate.rb, line 394
def DelegateClass(superclass, &block)
  klass = Class.new(Delegator)
  ignores = [*::Delegator.public_api, :to_s, :inspect, :=~, :!~, :===]
  protected_instance_methods = superclass.protected_instance_methods
  protected_instance_methods -= ignores
  public_instance_methods = superclass.public_instance_methods
  public_instance_methods -= ignores
  klass.module_eval do
    def __getobj__ # :nodoc:
      unless defined?(@delegate_dc_obj)
        return yield if block_given?
        __raise__ ::ArgumentError, "not delegated"
      end
      @delegate_dc_obj
    end
    def __setobj__(obj)  # :nodoc:
      __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
      @delegate_dc_obj = obj
    end
    protected_instance_methods.each do |method|
      define_method(method, Delegator.delegating_block(method))
      protected method
    end
    public_instance_methods.each do |method|
      define_method(method, Delegator.delegating_block(method))
    end
  end
  klass.define_singleton_method :public_instance_methods do |all=true|
    super(all) | superclass.public_instance_methods
  end
  klass.define_singleton_method :protected_instance_methods do |all=true|
    super(all) | superclass.protected_instance_methods
  end
  klass.define_singleton_method :instance_methods do |all=true|
    super(all) | superclass.instance_methods
  end
  klass.define_singleton_method :public_instance_method do |name|
    super(name)
  rescue NameError
    raise unless self.public_instance_methods.include?(name)
    superclass.public_instance_method(name)
  end
  klass.define_singleton_method :instance_method do |name|
    super(name)
  rescue NameError
    raise unless self.instance_methods.include?(name)
    superclass.instance_method(name)
  end
  klass.module_eval(&block) if block
  return klass
end

Основной интерфейс этой библиотеки. Используется для настройки делегирования при определении вашего класса.

class MyClass < DelegateClass(ClassToDelegateTo) # Step 1
  def initialize
    super(obj_of_ClassToDelegateTo)              # Step 2
  end
end

или:

MyClass = DelegateClass(ClassToDelegateTo) do    # Step 1
  def initialize
    super(obj_of_ClassToDelegateTo)              # Step 2
  end
end

Вот пример использования из Tempfile, который на самом деле является объектом File с некоторыми специальными правилами относительно места хранения и времени удаления File. Это почти идеальный пример того, как использовать делегирование.

class Tempfile < DelegateClass(File)
  # constant and class member data initialization...

  def initialize(basename, tmpdir=Dir::tmpdir)
    # build up file path/name in var tmpname...

    @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)

    # ...

    super(@tmpfile)

    # below this point, all methods of File are supported...
  end

  # ...
end
Вызывает метод суперкласса
Digest(name) → digest_subclass Показать исходный код
# File ext/digest/lib/digest.rb, line 110
def Digest(name)
  const = name.to_sym
  Digest::REQUIRE_MUTEX.synchronize {
    # Ignore autoload's because it is void when we have #const_missing
    Digest.const_missing(const)
  }
rescue LoadError
  # Constants do not necessarily rely on digest/*.
  if Digest.const_defined?(const)
    Digest.const_get(const)
  else
    raise
  end
end

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

require 'digest'

Digest("MD5")
# => Digest::MD5

Digest(:SHA256)
# => Digest::SHA256

Digest(:Foo)
# => LoadError: library not found for class Digest::Foo -- digest/foo
define_singleton_method(symbol, method) → symbol Показать исходный код
define_singleton_method(symbol) { block } → symbol
static VALUE
rb_obj_define_method(int argc, VALUE *argv, VALUE obj)
{
    VALUE klass = rb_singleton_class(obj);

    return rb_mod_define_method(argc, argv, klass);
}

Определяет метод-синглетон в получателе. Параметр method может быть Proc, Method или UnboundMethod объектом. Если задан блок, он используется в качестве тела метода. Если у блока или метода есть параметры, они используются как параметры метода.

class A
  class << self
    def class_name
      to_s
    end
  end
end
A.define_singleton_method(:who_am_i) do
  "I am: #{class_name}"
end
A.who_am_i   # ==> "I am: A"

guy = "Bob"
guy.define_singleton_method(:hello) { "#{self}: Hello there!" }
guy.hello    #=>  "Bob: Hello there!"

chris = "Chris"
chris.define_singleton_method(:greet) {|greeting| "#{greeting}, I'm Chris!" }
chris.greet("Hi") #=> "Hi, I'm Chris!"
display(port=$>) → nil Показать исходный код
static VALUE
rb_obj_display(int argc, VALUE *argv, VALUE self)
{
    VALUE out;

    out = (!rb_check_arity(argc, 0, 1) ? rb_ractor_stdout() : argv[0]);
    rb_io_write(out, self);

    return Qnil;
}

Выводит obj в указанный порт (по умолчанию $>). Эквивалентно:

def display(port=$>)
  port.write self
  nil
end

Например:

1.display
"cat".display
[ 4, 5, 6 ].display
puts

выводит:

1cat[4, 5, 6]
dup → an_object Показать исходный код
VALUE
rb_obj_dup(VALUE obj)
{
    VALUE dup;

    if (special_object_p(obj)) {
        return obj;
    }
    dup = rb_obj_alloc(rb_obj_class(obj));
    init_copy(dup, obj);
    rb_funcall(dup, id_init_dup, 1, obj);

    return dup;
}

Создает неглубокую копию obj — переменные экземпляра obj копируются, но не объекты, на которые они ссылаются.

Этот метод может иметь поведение, специфичное для класса. В этом случае оно будет документировано в методе #initialize_copy класса.

о dup и clone

В общем случае, clone и dup могут иметь разные семантику в производных классах. clone используется для дублирования объекта, включая его внутреннее состояние, dup обычно использует класс производного объекта для создания нового экземпляра.

При использовании dup, любые модули, с которыми был расширен объект, не будут скопированы.

class Klass
  attr_accessor :str
end

module Foo
  def foo; 'foo'; end
end

s1 = Klass.new #=> #<Klass:0x401b3a38>
s1.extend(Foo) #=> #<Klass:0x401b3a38>
s1.foo #=> "foo"

s2 = s1.clone #=> #<Klass:0x401be280>
s2.foo #=> "foo"

s3 = s1.dup #=> #<Klass:0x401c1084>
s3.foo #=> NoMethodError: undefined method `foo' for #<Klass:0x401c1084>
enum_for(method = :each, *args) → enum
enum_for(method = :each, *args){|*args| block} → enum

Создает новый Enumerator, который будет перечислять вызывая method для obj, передавая args если они есть. То, что было возвращено методом, становится значениями перечислителя.

Если задан блок, он будет использоваться для вычисления размера перечислителя без необходимости итерации (см. Enumerator#size).

Примеры

str = "xyz"

enum = str.enum_for(:each_byte)
enum.each { |b| puts b }
# => 120
# => 121
# => 122

# protect an array from being modified by some_method
a = [1, 2, 3]
some_method(a.to_enum)

# String#split in block form is more memory-effective:
very_large_string.split("|") { |chunk| return chunk if chunk.include?('DATE') }
# This could be rewritten more idiomatically with to_enum:
very_large_string.to_enum(:split, "|").lazy.grep(/DATE/).first

Обычно вызывают to_enum при определении методов для универсального Enumerable, если не указан блок.

Вот такой пример с передачей параметров и блоком вычисления размера:

module Enumerable
  # a generic method to repeat the values of any enumerable
  def repeat(n)
    raise ArgumentError, "#{n} is negative!" if n < 0
    unless block_given?
      return to_enum(__method__, n) do # __method__ is :repeat here
        sz = size     # Call size and multiply by n...
        sz * n if sz  # but return nil if size itself is nil
      end
    end
    each do |*val|
      n.times { yield *val }
    end
  end
end

%i[hello world].repeat(2) { |w| puts w }
  # => Prints 'hello', 'hello', 'world', 'world'
enum = (1..14).repeat(3)
  # => returns an Enumerator when called without a block
enum.first(4) # => [1, 1, 1, 2]
enum.size # => 42
Псевдоним для: to_enum
obj == other → true или false Показать исходный код
equal?(other) → true или false
eql?(other) → true или false
MJIT_FUNC_EXPORTED VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
    return RBOOL(obj1 == obj2);
}

Равенство — На уровне Object, == возвращает true только если obj и other являются одним и тем же объектом. Обычно этот метод переопределяется в производных классах, чтобы придать ему специфическое для класса значение.

В отличие от ==, метод equal? никогда не должен переопределяться подклассами, так как он используется для определения идентичности объекта (т. е., a.equal?(b) тогда и только тогда, когда a является тем же объектом, что и b):

obj = "a"
other = obj.dup

obj == other      #=> true
obj.equal? other  #=> false
obj.equal? obj    #=> true

Метод eql? возвращает true если obj и other ссылаются на один и тот же ключ хэша. Это используется классом Hash для проверки равенства членов. Для любой пары объектов, где eql? возвращает true, значение hash обоих объектов должно быть одинаковым. Таким образом, любой подкласс, переопределяющий eql?, должен соответствующим образом переопределить и hash.

Для объектов класса Object, eql? синонимичен с ==. Подклассы обычно продолжают эту традицию, присваивая eql? своему переопределенному методу ==, но есть исключения. Типы Numeric, например, выполняют преобразование типов через ==, но не через eql?, поэтому:

1 == 1.0     #=> true
1.eql? 1.0   #=> false
extend(module, ...) → obj Показать исходный код
static VALUE
rb_obj_extend(int argc, VALUE *argv, VALUE obj)
{
    int i;
    ID id_extend_object, id_extended;

    CONST_ID(id_extend_object, "extend_object");
    CONST_ID(id_extended, "extended");

    rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
    for (i = 0; i < argc; i++)
        Check_Type(argv[i], T_MODULE);
    while (argc--) {
        rb_funcall(argv[argc], id_extend_object, 1, obj);
        rb_funcall(argv[argc], id_extended, 1, obj);
    }
    return obj;
}

Добавляет к obj методы экземпляров из каждого модуля, переданного в качестве параметра.

module Mod
  def hello
    "Hello from Mod.\n"
  end
end

class Klass
  def hello
    "Hello from Klass.\n"
  end
end

k = Klass.new
k.hello         #=> "Hello from Klass.\n"
k.extend(Mod)   #=> #<Klass:0x401b3bc8>
k.hello         #=> "Hello from Mod.\n"
freeze → obj Показать исходный код
VALUE
rb_obj_freeze(VALUE obj)
{
    if (!OBJ_FROZEN(obj)) {
        OBJ_FREEZE(obj);
        if (SPECIAL_CONST_P(obj)) {
            rb_bug("special consts should be frozen.");
        }
    }
    return obj;
}

Запрещает дальнейшие изменения в obj. Будет выброшено исключение FrozenError, если будет попытка изменения. Разморозить замороженный объект невозможно. См. также Object#frozen?.

Этот метод возвращает self.

a = [ "a", "b", "c" ]
a.freeze
a << "z"

возвращает:

prog.rb:3:in `<<': can't modify frozen Array (FrozenError)
 from prog.rb:3

Объекты следующих классов всегда заморожены: Integer, Float, Symbol.

hash → integer Показать исходный код
VALUE
rb_obj_hash(VALUE obj)
{
    long hnum = any_hash(obj, objid_hash);
    return ST2FIX(hnum);
}

Генерирует значение хеша типа Integer для этого объекта. Эта функция должна иметь свойство, что a.eql?(b) подразумевает a.hash == b.hash.

Значение хеша используется вместе с eql? классом Hash для определения, ссылаются ли два объекта на один и тот же ключ хеша. Любое значение хеша, превышающее емкость Integer, будет усечено перед использованием.

Значение хеша для объекта может отличаться при разных вызовах или реализациях Ruby. Если вам нужен стабильный идентификатор в разных вызовах и реализациях Ruby, вам необходимо сгенерировать его с помощью пользовательского метода.

Некоторые основные классы, такие как Integer, используют встроенные вычисления хешей и не вызывают метод hash при использовании в качестве ключа хеша.

inspect → string Показать исходный код
static VALUE
rb_obj_inspect(VALUE obj)
{
    if (rb_ivar_count(obj) > 0) {
        VALUE str;
        VALUE c = rb_class_name(CLASS_OF(obj));

        str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void*)obj);
        return rb_exec_recursive(inspect_obj, obj, str);
    }
    else {
        return rb_any_to_s(obj);
    }
}

Возвращает строку, содержащую удобочитаемое представление obj. По умолчанию inspect показывает имя класса объекта, кодировку его адреса памяти и список переменных экземпляра и их значений (вызывая inspect для каждого из них). Пользовательские классы должны переопределять этот метод, чтобы предоставить лучшее представление obj. При переопределении этого метода он должен возвращать строку, кодировка которой совместима с кодировкой по умолчанию внешнего представления.

[ 1, 2, 3..4, 'five' ].inspect   #=> "[1, 2, 3..4, \"five\"]"
Time.new.inspect                 #=> "2008-03-08 19:43:39 +0900"

class Foo
end
Foo.new.inspect                  #=> "#<Foo:0x0300c868>"

class Bar
  def initialize
    @bar = 1
  end
end
Bar.new.inspect                  #=> "#<Bar:0x0300c868 @bar=1>"
instance_of?(class) → true or false Показать исходный код
VALUE
rb_obj_is_instance_of(VALUE obj, VALUE c)
{
    c = class_or_module_required(c);
    return RBOOL(rb_obj_class(obj) == c);
}

Возвращает true , если obj является экземпляром заданного класса. См. также Object#kind_of?.

class A;     end
class B < A; end
class C < B; end

b = B.new
b.instance_of? A   #=> false
b.instance_of? B   #=> true
b.instance_of? C   #=> false
instance_variable_defined?(symbol) → true or false Показать исходный код
instance_variable_defined?(string) → true or false
static VALUE
rb_obj_ivar_defined(VALUE obj, VALUE iv)
{
    ID id = id_for_var(obj, iv, instance);

    if (!id) {
        return Qfalse;
    }
    return rb_ivar_defined(obj, id);
}

Возвращает true , если заданная переменная экземпляра определена в obj. Аргументы типа String преобразуются в символы.

class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
fred.instance_variable_defined?(:@a)    #=> true
fred.instance_variable_defined?("@b")   #=> true
fred.instance_variable_defined?("@c")   #=> false
instance_variable_get(symbol) → obj Показать исходный код
instance_variable_get(string) → obj
static VALUE
rb_obj_ivar_get(VALUE obj, VALUE iv)
{
    ID id = id_for_var(obj, iv, instance);

    if (!id) {
        return Qnil;
    }
    return rb_ivar_get(obj, id);
}

Возвращает значение заданной переменной экземпляра или nil, если переменная экземпляра не задана. Часть имени переменной @ должна быть включена для обычных переменных экземпляра. Выбрасывает исключение NameError, если переданный символ не является допустимым именем переменной экземпляра. Аргументы типа String преобразуются в символы.

class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
fred.instance_variable_get(:@a)    #=> "cat"
fred.instance_variable_get("@b")   #=> 99
instance_variable_set(symbol, obj) → obj Показать исходный код
instance_variable_set(string, obj) → obj
static VALUE
rb_obj_ivar_set(VALUE obj, VALUE iv, VALUE val)
{
    ID id = id_for_var(obj, iv, instance);
    if (!id) id = rb_intern_str(iv);
    return rb_ivar_set(obj, id, val);
}

Устанавливает переменную экземпляра, имя которой задано symbol, в указанный объект. Это может обойти предназначенную автором класса инкапсуляцию, поэтому следует использовать с осторожностью. Переменная не обязательно должна существовать до этого вызова. Если имя переменной экземпляра передается как строка, эта строка преобразуется в символ.

class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
fred.instance_variable_set(:@a, 'dog')   #=> "dog"
fred.instance_variable_set(:@c, 'cat')   #=> "cat"
fred.inspect                             #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"
instance_variables → array Показать исходный код
VALUE
rb_obj_instance_variables(VALUE obj)
{
    VALUE ary;

    ary = rb_ary_new();
    rb_ivar_foreach(obj, ivar_i, ary);
    return ary;
}

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

class Fred
  attr_accessor :a1
  def initialize
    @iv = 3
  end
end
Fred.new.instance_variables   #=> [:@iv]
is_a?(class) → true or false

Возвращает true , если class является классом obj или если class является одним из суперклассов obj или модулей, включённых в obj.

module M;    end
class A
  include M
end
class B < A; end
class C < B; end

b = B.new
b.is_a? A          #=> true
b.is_a? B          #=> true
b.is_a? C          #=> false
b.is_a? M          #=> true

b.kind_of? A       #=> true
b.kind_of? B       #=> true
b.kind_of? C       #=> false
b.kind_of? M       #=> true
Псевдоним для: kind_of?
itself → obj Показать исходный код
static VALUE
rb_obj_itself(VALUE obj)
{
    return obj;
}

Возвращает получателя.

string = "my string"
string.itself.object_id == string.object_id   #=> true
kind_of?(class) → true or false Показать исходный код
VALUE
rb_obj_is_kind_of(VALUE obj, VALUE c)
{
    VALUE cl = CLASS_OF(obj);

    // Note: YJIT needs this function to never allocate and never raise when
    // `c` is a class or a module.
    c = class_or_module_required(c);
    return RBOOL(class_search_ancestor(cl, RCLASS_ORIGIN(c)));
}

Возвращает true , если class является классом obj или если class является одним из суперклассов obj или модулей, включённых в obj.

module M;    end
class A
  include M
end
class B < A; end
class C < B; end

b = B.new
b.is_a? A          #=> true
b.is_a? B          #=> true
b.is_a? C          #=> false
b.is_a? M          #=> true

b.kind_of? A       #=> true
b.kind_of? B       #=> true
b.kind_of? C       #=> false
b.kind_of? M       #=> true
Также алиас: is_a?
method(sym) → method Показать исходный код
VALUE
rb_obj_method(VALUE obj, VALUE vid)
{
    return obj_method(obj, vid, FALSE);
}

Ищет метод с заданным именем как получатель в obj, возвращая объект Method (или вызывая NameError). Объект Method выступает в качестве замыкания в экземпляре объекта obj, поэтому переменные экземпляра и значение self остаются доступными.

class Demo
  def initialize(n)
    @iv = n
  end
  def hello()
    "Hello, @iv = #{@iv}"
  end
end

k = Demo.new(99)
m = k.method(:hello)
m.call   #=> "Hello, @iv = 99"

l = Demo.new('Fred')
m = l.method("hello")
m.call   #=> "Hello, @iv = Fred"

Обратите внимание, что Method реализует метод to_proc, что означает, что он может использоваться с итераторами.

[ 1, 2, 3 ].each(&method(:puts)) # => prints 3 lines to stdout

out = File.open('test.txt', 'w')
[ 1, 2, 3 ].each(&out.method(:puts)) # => prints 3 lines to file

require 'date'
%w[2017-03-01 2017-03-02].collect(&Date.method(:parse))
#=> [#<Date: 2017-03-01 ((2457814j,0s,0n),+0s,2299161j)>, #<Date: 2017-03-02 ((2457815j,0s,0n),+0s,2299161j)>]
methods(regular=true) → array Показать исходный код
VALUE
rb_obj_methods(int argc, const VALUE *argv, VALUE obj)
{
    rb_check_arity(argc, 0, 1);
    if (argc > 0 && !RTEST(argv[0])) {
	return rb_obj_singleton_methods(argc, argv, obj);
    }
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
}

Возвращает список имён публичных и защищённых методов obj. Это будет включать все методы, доступные в предках obj. Если необязательный параметр равен false, он возвращает массив публичных и защищённых синглтонов obj, массив не будет включать методы в модулях, включённых в obj.

class Klass
  def klass_method()
  end
end
k = Klass.new
k.methods[0..9]    #=> [:klass_method, :nil?, :===,
                   #    :==~, :!, :eql?
                   #    :hash, :<=>, :class, :singleton_class]
k.methods.length   #=> 56

k.methods(false)   #=> []
def k.singleton_method; end
k.methods(false)   #=> [:singleton_method]

module M123; def m123; end end
k.extend M123
k.methods(false)   #=> [:singleton_method]
nil? → true or false Показать исходный код
MJIT_FUNC_EXPORTED VALUE
rb_false(VALUE obj)
{
    return Qfalse;
}

Только объект nil отвечает true на nil?.

Object.new.nil?   #=> false
nil.nil?          #=> true
END_OF_DOCUMENT_MARKER
__id__ → целое Показать исходный код
object_id → целое
VALUE
rb_obj_id(VALUE obj)
{
    /*
     *                32-bit VALUE space
     *          MSB ------------------------ LSB
     *  false   00000000000000000000000000000000
     *  true    00000000000000000000000000000010
     *  nil     00000000000000000000000000000100
     *  undef   00000000000000000000000000000110
     *  symbol  ssssssssssssssssssssssss00001110
     *  object  oooooooooooooooooooooooooooooo00        = 0 (mod sizeof(RVALUE))
     *  fixnum  fffffffffffffffffffffffffffffff1
     *
     *                    object_id space
     *                                       LSB
     *  false   00000000000000000000000000000000
     *  true    00000000000000000000000000000010
     *  nil     00000000000000000000000000000100
     *  undef   00000000000000000000000000000110
     *  symbol   000SSSSSSSSSSSSSSSSSSSSSSSSSSS0        S...S % A = 4 (S...S = s...s * A + 4)
     *  object   oooooooooooooooooooooooooooooo0        o...o % A = 0
     *  fixnum  fffffffffffffffffffffffffffffff1        bignum if required
     *
     *  where A = sizeof(RVALUE)/4
     *
     *  sizeof(RVALUE) is
     *  20 if 32-bit, double is 4-byte aligned
     *  24 if 32-bit, double is 8-byte aligned
     *  40 if 64-bit
     */

    return rb_find_object_id(obj, cached_object_id);
}

Возвращает целое число, идентификатор obj.

То же число будет возвращаться при каждом вызове object_id для данного объекта, и никакие два активных объекта не будут иметь одинаковый идентификатор.

Примечание: некоторые объекты встроенных классов повторно используются для оптимизации. Это относится к непосредственным значениям и неизменяемым строковым литералам.

BasicObject реализует +__id__+, Kernel реализует object_id.

Непосредственные значения передаются по значению, а не по ссылке: nil, true, false, Fixnums, Symbols и некоторые Floats.

Object.new.object_id  == Object.new.object_id  # => false
(21 * 2).object_id    == (21 * 2).object_id    # => true
"hello".object_id     == "hello".object_id     # => false
"hi".freeze.object_id == "hi".freeze.object_id # => true
private_methods(all=true) → массив Показать исходный код
VALUE
rb_obj_private_methods(int argc, const VALUE *argv, VALUE obj)
{
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_priv_i);
}

Возвращает список закрытых методов, доступных для obj. Если параметр all равен false, будут перечислены только те методы, которые находятся в получателе.

protected_methods(all=true) → массив Показать исходный код
VALUE
rb_obj_protected_methods(int argc, const VALUE *argv, VALUE obj)
{
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_prot_i);
}

Возвращает список защищенных методов, доступных для obj. Если параметр all равен false, будут перечислены только те методы, которые находятся в получателе.

public_method(sym) → метод Показать исходный код
VALUE
rb_obj_public_method(VALUE obj, VALUE vid)
{
    return obj_method(obj, vid, TRUE);
}

Аналогично методу method, ищет только общедоступные методы.

public_methods(all=true) → массив Показать исходный код
VALUE
rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj)
{
    return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_pub_i);
}

Возвращает список общедоступных методов, доступных для obj. Если параметр all равен false, будут перечислены только те методы, которые находятся в получателе.

public_send(символ [, args...]) → obj Показать исходный код
public_send(строка [, args...]) → obj
static VALUE
rb_f_public_send(int argc, VALUE *argv, VALUE recv)
{
    return send_internal_kw(argc, argv, recv, CALL_PUBLIC);
}

Вызывает метод, идентифицированный символом символ, передавая ему указанные аргументы. В отличие от send, public_send вызывает только общедоступные методы. Когда метод идентифицируется строкой, строка преобразуется в символ.

1.public_send(:puts, "hello")  # causes NoMethodError
remove_instance_variable(символ) → obj Показать исходный код
remove_instance_variable(строка) → obj
VALUE
rb_obj_remove_instance_variable(VALUE obj, VALUE name)
{
    VALUE val = Qnil;
    const ID id = id_for_var(obj, name, an, instance);
    st_data_t n, v;
    struct st_table *iv_index_tbl;
    uint32_t index;

    rb_check_frozen(obj);
    if (!id) {
	goto not_defined;
    }

    switch (BUILTIN_TYPE(obj)) {
      case T_OBJECT:
        iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
        if (iv_index_tbl_lookup(iv_index_tbl, id, &index) &&
            index < ROBJECT_NUMIV(obj) &&
            (val = ROBJECT_IVPTR(obj)[index]) != Qundef) {
            ROBJECT_IVPTR(obj)[index] = Qundef;
            return val;
        }
	break;
      case T_CLASS:
      case T_MODULE:
        IVAR_ACCESSOR_SHOULD_BE_MAIN_RACTOR(id);
	n = id;
	if (RCLASS_IV_TBL(obj) && lock_st_delete(RCLASS_IV_TBL(obj), &n, &v)) {
	    return (VALUE)v;
	}
	break;
      default:
	if (FL_TEST(obj, FL_EXIVAR)) {
	    if (generic_ivar_remove(obj, id, &val)) {
		return val;
	    }
	}
	break;
    }

  not_defined:
    rb_name_err_raise("instance variable %1$s not defined",
		      obj, name);
    UNREACHABLE_RETURN(Qnil);
}

Удаляет именованную переменную экземпляра из obj, возвращая значение этой переменной. Аргументы типа String преобразуются в символы.

class Dummy
  attr_reader :var
  def initialize
    @var = 99
  end
  def remove
    remove_instance_variable(:@var)
  end
end
d = Dummy.new
d.var      #=> 99
d.remove   #=> 99
d.var      #=> nil
respond_to?(символ, include_all=false) → true или false Показать исходный код
respond_to?(строка, include_all=false) → true или false
static VALUE
obj_respond_to(int argc, VALUE *argv, VALUE obj)
{
    VALUE mid, priv;
    ID id;
    rb_execution_context_t *ec = GET_EC();

    rb_scan_args(argc, argv, "11", &mid, &priv);
    if (!(id = rb_check_id(&mid))) {
        VALUE ret = basic_obj_respond_to_missing(ec, CLASS_OF(obj), obj,
                                                 rb_to_symbol(mid), priv);
        if (ret == Qundef) ret = Qfalse;
        return ret;
    }
    return  RBOOL(basic_obj_respond_to(ec, obj, id, !RTEST(priv)));
}

Возвращает true, если obj отвечает на данный метод. Закрытые и защищенные методы включаются в поиск только если необязательный второй параметр равен true.

Если метод не реализован, например, Process.fork в Windows, File.lchmod в GNU/Linux и т.д., возвращается false.

Если метод не определен, вызывается метод respond_to_missing? и возвращается результат.

Если имя метода задано в виде строки, строка преобразуется в символ.

respond_to_missing?(символ, include_all) → true или false Показать исходный код
respond_to_missing?(строка, include_all) → true или false
static VALUE
obj_respond_to_missing(VALUE obj, VALUE mid, VALUE priv)
{
    return Qfalse;
}

НЕ ИСПОЛЬЗОВАТЬ НЕПОСРЕДСТВЕННО.

Метод-обработчик, возвращающий, может ли obj ответить на метод id или нет.

См. respond_to?, и пример из BasicObject.

send(символ [, args...]) → obj Показать исходный код
__send__(символ [, args...]) → obj
send(строка [, args...]) → obj
__send__(строка [, args...]) → obj
VALUE
rb_f_send(int argc, VALUE *argv, VALUE recv)
{
    return send_internal_kw(argc, argv, recv, CALL_FCALL);
}

Вызывает метод, идентифицированный символом символ, передавая ему указанные аргументы. Если метод идентифицирован строкой, строка преобразуется в символ.

BasicObject реализует +__send__+, Kernel реализует send. __send__ безопаснее, чем send , когда у obj есть метод с таким же именем, как Socket. См. также public_send.

class Klass
  def hello(*args)
    "Hello " + args.join(' ')
  end
end
k = Klass.new
k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"
singleton_class → класс Показать исходный код
static VALUE
rb_obj_singleton_class(VALUE obj)
{
    return rb_singleton_class(obj);
}

Возвращает синглтон-класс объекта obj. Этот метод создаёт новый синглтон-класс, если у obj его нет.

Если obj равен nil, true, или false, возвращает NilClass, TrueClass, или FalseClass соответственно. Если obj является Integer, Float или Symbol, генерируется исключение TypeError.

Object.new.singleton_class  #=> #<Class:#<Object:0xb7ce1e24>>
String.singleton_class      #=> #<Class:String>
nil.singleton_class         #=> NilClass
singleton_method(sym) → метод Показать исходный код
VALUE
rb_obj_singleton_method(VALUE obj, VALUE vid)
{
    VALUE klass = rb_singleton_class_get(obj);
    ID id = rb_check_id(&vid);

    if (NIL_P(klass)) {
        /* goto undef; */
    }
    else if (NIL_P(klass = RCLASS_ORIGIN(klass))) {
        /* goto undef; */
    }
    else if (! id) {
        VALUE m = mnew_missing_by_name(klass, obj, &vid, FALSE, rb_cMethod);
        if (m) return m;
        /* else goto undef; */
    }
    else {
        const rb_method_entry_t *me = rb_method_entry_at(klass, id);
        vid = ID2SYM(id);

        if (UNDEFINED_METHOD_ENTRY_P(me)) {
            /* goto undef; */
        }
        else if (UNDEFINED_REFINED_METHOD_P(me->def)) {
            /* goto undef; */
        }
        else {
            return mnew_from_me(me, klass, klass, obj, id, rb_cMethod, FALSE);
        }
    }

  /* undef: */
    rb_name_err_raise("undefined singleton method `%1$s' for `%2$s'",
                      obj, vid);
    UNREACHABLE_RETURN(Qundef);
}

Аналогично методу method, ищет только синглтон-методы.

class Demo
  def initialize(n)
    @iv = n
  end
  def hello()
    "Hello, @iv = #{@iv}"
  end
end

k = Demo.new(99)
def k.hi
  "Hi, @iv = #{@iv}"
end
m = k.singleton_method(:hi)
m.call   #=> "Hi, @iv = 99"
m = k.singleton_method(:hello) #=> NameError
singleton_methods(all=true) → массив Показать исходный код
VALUE
rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
{
    VALUE ary, klass, origin;
    struct method_entry_arg me_arg;
    struct rb_id_table *mtbl;
    int recur = TRUE;

    if (rb_check_arity(argc, 0, 1)) recur = RTEST(argv[0]);
    if (RB_TYPE_P(obj, T_CLASS) && FL_TEST(obj, FL_SINGLETON)) {
        rb_singleton_class(obj);
    }
    klass = CLASS_OF(obj);
    origin = RCLASS_ORIGIN(klass);
    me_arg.list = st_init_numtable();
    me_arg.recur = recur;
    if (klass && FL_TEST(klass, FL_SINGLETON)) {
	if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
	klass = RCLASS_SUPER(klass);
    }
    if (recur) {
	while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) {
	    if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
	    klass = RCLASS_SUPER(klass);
	}
    }
    ary = rb_ary_new2(me_arg.list->num_entries);
    st_foreach(me_arg.list, ins_methods_i, ary);
    st_free_table(me_arg.list);

    return ary;
}

Возвращает массив имён синглтон-методов для obj. Если необязательный параметр all равен true, список будет включать методы из модулей, включённых в obj. Возвращаются только общедоступные и защищенные синглтон-методы.

module Other
  def three() end
end

class Single
  def Single.four() end
end

a = Single.new

def a.one()
end

class << a
  include Other
  def two()
  end
end

Single.singleton_methods    #=> [:four]
a.singleton_methods(false)  #=> [:two, :one]
a.singleton_methods         #=> [:two, :one, :three]
taint → obj Показать исходный код
VALUE
rb_obj_taint(VALUE obj)
{
    rb_warn_deprecated_to_remove_at(3.2, "Object#taint", NULL);
    return obj;
}

Возвращает объект. Этот метод устарел и будет удален в Ruby 3.2.

tainted? → false Показать исходный код
VALUE
rb_obj_tainted(VALUE obj)
{
    rb_warn_deprecated_to_remove_at(3.2, "Object#tainted?", NULL);
    return Qfalse;
}

Возвращает false. Этот метод устарел и будет удален в Ruby 3.2.

to_enum(method = :each, *args) → enum Показать исходный код
to_enum(method = :each, *args) {|*args| block} → enum
static VALUE
obj_to_enum(int argc, VALUE *argv, VALUE obj)
{
    VALUE enumerator, meth = sym_each;

    if (argc > 0) {
        --argc;
        meth = *argv++;
    }
    enumerator = rb_enumeratorize_with_size(obj, meth, argc, argv, 0);
    if (rb_block_given_p()) {
        enumerator_ptr(enumerator)->size = rb_block_proc();
    }
    return enumerator;
}

Создаёт новый Enumerator, который будет перечислять, вызывая method на obj, передавая args при необходимости. Значения, возвращаемые методом, станут значениями перечислителя.

Если задан блок, он будет использован для вычисления размера перечислителя без необходимости его итерирования (см. Enumerator#size).

Примеры

str = "xyz"

enum = str.enum_for(:each_byte)
enum.each { |b| puts b }
# => 120
# => 121
# => 122

# protect an array from being modified by some_method
a = [1, 2, 3]
some_method(a.to_enum)

# String#split in block form is more memory-effective:
very_large_string.split("|") { |chunk| return chunk if chunk.include?('DATE') }
# This could be rewritten more idiomatically with to_enum:
very_large_string.to_enum(:split, "|").lazy.grep(/DATE/).first

Обычно to_enum вызывается при определении методов для обобщённого Enumerable в случае отсутствия блока.

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

module Enumerable
  # a generic method to repeat the values of any enumerable
  def repeat(n)
    raise ArgumentError, "#{n} is negative!" if n < 0
    unless block_given?
      return to_enum(__method__, n) do # __method__ is :repeat here
        sz = size     # Call size and multiply by n...
        sz * n if sz  # but return nil if size itself is nil
      end
    end
    each do |*val|
      n.times { yield *val }
    end
  end
end

%i[hello world].repeat(2) { |w| puts w }
  # => Prints 'hello', 'hello', 'world', 'world'
enum = (1..14).repeat(3)
  # => returns an Enumerator when called without a block
enum.first(4) # => [1, 1, 1, 2]
enum.size # => 42
Также алиас: enum_for
to_s → string Показать исходный код
VALUE
rb_any_to_s(VALUE obj)
{
    VALUE str;
    VALUE cname = rb_class_name(CLASS_OF(obj));

    str = rb_sprintf("#<%"PRIsVALUE":%p>", cname, (void*)obj);

    return str;
}

Возвращает строку, представляющую obj. По умолчанию to_s выводит класс объекта и кодировку идентификатора объекта. В качестве исключения, основной объект, являющийся начальной средой выполнения Ruby-программ, возвращает «main».

to_yaml(options = {}) Показать исходный код
# File ext/psych/lib/psych/core_ext.rb, line 12
def to_yaml options = {}
  Psych.dump self, options
end

Преобразует объект в YAML. Смотрите Psych.dump для получения дополнительной информации о доступных options.

trust → obj Показать исходный код
VALUE
rb_obj_trust(VALUE obj)
{
    rb_warn_deprecated_to_remove_at(3.2, "Object#trust", NULL);
    return obj;
}

Возвращает объект. Этот метод устарел и будет удалён в Ruby 3.2.

untaint → obj Показать исходный код
VALUE
rb_obj_untaint(VALUE obj)
{
    rb_warn_deprecated_to_remove_at(3.2, "Object#untaint", NULL);
    return obj;
}

Возвращает объект. Этот метод устарел и будет удалён в Ruby 3.2.

untrust → obj Показать исходный код
VALUE
rb_obj_untrust(VALUE obj)
{
    rb_warn_deprecated_to_remove_at(3.2, "Object#untrust", NULL);
    return obj;
}

Возвращает объект. Этот метод устарел и будет удалён в Ruby 3.2.

untrusted? → false Показать исходный код
VALUE
rb_obj_untrusted(VALUE obj)
{
    rb_warn_deprecated_to_remove_at(3.2, "Object#untrusted?", NULL);
    return Qfalse;
}

Возвращает false. Этот метод устарел и будет удалён в Ruby 3.2.

xmp(exps, bind = nil) Показать исходный код
# File lib/irb/xmp.rb, line 165
def xmp(exps, bind = nil)
  bind = IRB::Frame.top(1) unless bind
  xmp = XMP.new(bind)
  xmp.puts exps
  xmp
end

Удобный метод, доступный только при подключении стандартной библиотеки IRB::XMP.

Создаёт новый XMP объект, используя заданные выражения в качестве параметра exps, и необязательную привязку в качестве bind, или использует глобальную привязку. Затем вычисляет заданные выражения, используя режим запроса :XMP.

Например:

require 'irb/xmp'
ctx = binding
xmp 'foo = "bar"', ctx
#=> foo = "bar"
  #==>"bar"
ctx.eval 'foo'
#=> "bar"

Для получения дополнительной информации смотрите XMP.new.

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

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