Spec-Zone.ru › Ruby 2.6

класс Object

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

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

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

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

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

Константы

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 (класс) для получения более подробной информации.

FALSE

Устаревший псевдоним false

Fixnum

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

NIL

Устаревший псевдоним nil

ParseError
RUBY_COPYRIGHT

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

RUBY_DESCRIPTION

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

RUBY_ENGINE

Двигатель или интерпретатор, используемый этим ruby.

RUBY_ENGINE_VERSION

Версия двигателя или интерпретатора, используемого этим ruby.

RUBY_PATCHLEVEL

Номер патча для этого ruby. Если это тестовая версия ruby, номер патча будет -1

RUBY_PLATFORM

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

RUBY_RELEASE_DATE

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

RUBY_REVISION

SVN-ревизия для этого ruby.

RUBY_VERSION

Используемая версия ruby

STDERR

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

STDIN

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

STDOUT

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

Synchronizer

Класс, обеспечивающий двухфазную блокировку с счётчиком. Для подробностей см. Sync_m.

Synchronizer_m

Модуль, предоставляющий двухфазную блокировку с счётчиком.

TOPLEVEL_BINDING

Binding верхнего уровня

TRUE

Устаревший псевдоним true

ThWait

Этот класс отслеживает завершение нескольких потоков. Основной функционал (ожидание завершения указанных потоков) доступен через метод класса ThreadsWait::all_waits. Более тонкий контроль возможен с помощью методов экземпляра.

Пример:

ThreadsWait.all_waits(thr1, thr2, ...) do |t|
  STDERR.puts "Thread #{t} has terminated."
end

th = ThreadsWait.new(thread1,...)
th.next_wait # next one to be done
TimeoutError

Выбрасывается Timeout.timeout при истечении времени ожидания блока.

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

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

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

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 (obj1 == obj2 || 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 Показать исходный код
VALUE
rb_equal(VALUE obj1, VALUE obj2)
{
    VALUE result;

    if (obj1 == obj2) return Qtrue;
    result = rb_equal_opt(obj1, obj2);
    if (result == Qundef) {
        result = rb_funcall(obj1, id_eq, 1, obj2);
    }
    if (RTEST(result)) return Qtrue;
    return Qfalse;
}

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

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

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

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

CSV(*args, &block) Показать исходный код
# File lib/csv.rb, line 1459
def CSV(*args, &block)
  CSV.instance(*args, &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
DelegateClass(superclass) Показать исходный код
# File lib/delegate.rb, line 386
def DelegateClass(superclass)
  klass = Class.new(Delegator)
  methods = superclass.instance_methods
  methods -= ::Delegator.public_api
  methods -= [:to_s, :inspect, :=~, :!~, :===]
  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
    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.protected_instance_methods
  end
  klass.define_singleton_method :protected_instance_methods do |all=true|
    super(all) | superclass.protected_instance_methods
  end
  return klass
end

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

class MyClass < DelegateClass(ClassToDelegateTo) # 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 96
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
class → class Показать исходный код
VALUE
rb_obj_class(VALUE obj)
{
    return rb_class_real(CLASS_OF(obj));
}

Возвращает класс объекта obj. Этот метод всегда должен вызываться с явным получателем, так как class также является зарезервированным словом в Ruby.

1.class      #=> Integer
self.class   #=> Object
clone(freeze: true) → an_object Показать исходный код
static VALUE
rb_obj_clone2(int argc, VALUE *argv, VALUE obj)
{
    int kwfreeze = freeze_opt(argc, argv);
    if (!special_object_p(obj))
        return mutable_obj_clone(obj, kwfreeze);
    return immutable_obj_clone(obj, kwfreeze);
}

Создаёт поверхностную копию объекта obj — переменные экземпляра obj копируются, но не объекты, на которые они ссылаются. clone копирует замороженный (если не указано ключевое слово :freeze со значением false) и помеченный статус obj. См. также обсуждение в Object#dup.

class Klass
   attr_accessor :str
end
s1 = Klass.new      #=> #<Klass:0x401b3a38>
s1.str = "Hello"    #=> "Hello"
s2 = s1.clone       #=> #<Klass:0x401b3998 @str="Hello">
s2.str[1,4] = "i"   #=> "i"
s1.inspect          #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
s2.inspect          #=> "#<Klass:0x401b3998 @str=\"Hi\">"

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

dclone() Показать исходный код
# File lib/rexml/xpath_parser.rb, line 11
def dclone
  clone
end

обеспечивает унифицированную операцию clone для REXML::XPathParser в разных типах объектов Object

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!"
display(port=$>) → nil Показать исходный код
static VALUE
rb_obj_display(int argc, VALUE *argv, VALUE self)
{
    VALUE out;

    out = (!rb_check_arity(argc, 0, 1) ? rb_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 копируются, но не объекты, на которые они ссылаются. dup копирует помеченный статус 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:0x401b3a38>
s2.foo #=> "foo"

s3 = s1.dup #=> #<Klass:0x401b3a38>
s3.foo #=> NoMethodError: undefined method `foo' for #<Klass:0x401b3a38>
enum_for(method = :each, *args) → enum Показать исходный код
enum_for(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)

Обычно вызывается 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
END_OF_DOCUMENT_MARKER
obj == other → true or false Show source
equal?(other) → true or false
eql?(other) → true or false
MJIT_FUNC_EXPORTED VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
    if (obj1 == obj2) return Qtrue;
    return Qfalse;
}

Равенство — На уровне 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 для проверки элементов на равенство. Для объектов класса Object, eql? является синонимом ==. Подклассы обычно продолжают эту традицию, создавая псевдоним eql? для их переопределенного метода ==, но есть исключения. Типы Numeric, например, выполняют преобразование типов через ==, но не через eql?, поэтому:

1 == 1.0     #=> true
1.eql? 1.0   #=> false
extend(module, ...) → obj Show source
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 Show source
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. RuntimeError будет вызвано, если будет предпринята попытка модификации. Нет способа разморозить замороженный объект. См. также 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.

frozen? → true or false Show source
VALUE
rb_obj_frozen_p(VALUE obj)
{
    return OBJ_FROZEN(obj) ? Qtrue : Qfalse;
}

Возвращает статус замораживания obj.

a = [ "a", "b", "c" ]
a.freeze    #=> ["a", "b", "c"]
a.frozen?   #=> true
gemfile(install = false, options = {}, &gemfile) Show source
# File lib/bundler/inline.rb, line 34
def gemfile(install = false, options = {}, &gemfile)
  require "bundler"

  opts = options.dup
  ui = opts.delete(:ui) { Bundler::UI::Shell.new }
  raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?

  old_root = Bundler.method(:root)
  def Bundler.root
    Bundler::SharedHelpers.pwd.expand_path
  end
  Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"

  Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
  builder = Bundler::Dsl.new
  builder.instance_eval(&gemfile)

  definition = builder.to_definition(nil, true)
  def definition.lock(*); end
  definition.validate_runtime!

  missing_specs = proc do
    definition.missing_specs?
  end

  Bundler.ui = ui if install
  if install || missing_specs.call
    Bundler.settings.temporary(:inline => true) do
      installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
      installer.post_install_messages.each do |name, message|
        Bundler.ui.info "Post-install message from #{name}:\n#{message}"
      end
    end
  end

  runtime = Bundler::Runtime.new(nil, definition)
  runtime.setup.require
ensure
  bundler_module = class << Bundler; self; end
  bundler_module.send(:define_method, :root, old_root) if old_root
end

Позволяет объявлять Gemfile внутри скрипта ruby, при желании устанавливая любые gems, которые еще не установлены в системе пользователя.

@note Каждый gem, указанный в этом 'Gemfile', будет `require`d, как если бы

the user had manually called `Bundler.require`. To avoid a requested gem
being automatically required, add the `:require => false` option to the
`gem` dependency declaration.

@param install [Boolean] указывает, установлены ли gems в

user's system should be installed.
Defaults to `false`.

@param gemfile [Proc] блок, который оценивается как `Gemfile`.

@example Использование встроенного Gemfile

#!/usr/bin/env ruby

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'json', require: false
  gem 'nap', require: 'rest'
  gem 'cocoapods', '~> 0.34.1'
end

puts Pod::VERSION # => "0.34.4"
inspect → string Show source
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 Show source
VALUE
rb_obj_is_instance_of(VALUE obj, VALUE c)
{
    c = class_or_module_required(c);
    if (rb_obj_class(obj) == c) return Qtrue;
    return Qfalse;
}

Возвращает 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 Show source
instance_variable_defined?(string) → true or false
static VALUE
rb_obj_ivar_defined(VALUE obj, VALUE iv)
{
    ID id = id_for_var(obj, iv, an, 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 Show source
instance_variable_get(string) → obj
static VALUE
rb_obj_ivar_get(VALUE obj, VALUE iv)
{
    ID id = id_for_var(obj, iv, an, 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 Show source
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, an, 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 Show source
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 Show source
VALUE
rb_obj_is_kind_of(VALUE obj, VALUE c)
{
    VALUE cl = CLASS_OF(obj);

    c = class_or_module_required(c);
    return class_search_ancestor(cl, RCLASS_ORIGIN(c)) ? Qtrue : Qfalse;
}

Возвращает 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
itself → obj Show source
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 Show source
VALUE
rb_obj_is_kind_of(VALUE obj, VALUE c)
{
    VALUE cl = CLASS_OF(obj);

    c = class_or_module_required(c);
    return class_search_ancestor(cl, RCLASS_ORIGIN(c)) ? Qtrue : Qfalse;
}

Возвращает 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
method(sym) → method Show source
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) → массив Показать исходный код
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]
namespace(name) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/rake_compat.rb, line 60
def namespace(name)
  if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
    const_name = Bundler::Thor::Util.camel_case(name.to_s).to_sym
    klass.const_set(const_name, Class.new(Bundler::Thor))
    new_klass = klass.const_get(const_name)
    Bundler::Thor::RakeCompat.rake_classes << new_klass
  end

  super
  Bundler::Thor::RakeCompat.rake_classes.pop
end
Вызывает метод суперкласса
Также алиасируется как: rake_namespace
nil? → true или false Показать исходный код
static VALUE
rb_false(VALUE obj)
{
    return Qfalse;
}

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

Object.new.nil?   #=> false
nil.nil?          #=> true
__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
     */
    if (STATIC_SYM_P(obj)) {
        return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
    }
    else if (FLONUM_P(obj)) {
#if SIZEOF_LONG == SIZEOF_VOIDP
        return LONG2NUM((SIGNED_VALUE)obj);
#else
        return LL2NUM((SIGNED_VALUE)obj);
#endif
    }
    else if (SPECIAL_CONST_P(obj)) {
        return LONG2NUM((SIGNED_VALUE)obj);
    }
    return nonspecial_obj_id(obj);
}

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

Одно и то же число будет возвращено при всех вызовах 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(argc, argv, recv, CALL_PUBLIC);
}

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

1.public_send(:puts, "hello")  # causes NoMethodError
rake_namespace(name)
Псевдоним для: namespace
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;
    st_data_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) break;
        if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) break;
        if (ROBJECT_NUMIV(obj) <= index) break;
        val = ROBJECT_IVPTR(obj)[index];
        if (val != Qundef) {
            ROBJECT_IVPTR(obj)[index] = Qundef;
            return val;
        }
	break;
      case T_CLASS:
      case T_MODULE:
	n = id;
	if (RCLASS_IV_TBL(obj) && 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;
    }
    if (basic_obj_respond_to(ec, obj, id, !RTEST(priv)))
        return Qtrue;
    return Qfalse;
}

Возвращает 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(argc, argv, recv, CALL_FCALL);
}

Вызывает метод, идентифицированный символом symbol, передавая любые указанные аргументы. Вы можете использовать __send__, если имя send конфликтует с существующим методом в obj. Если метод идентифицируется строкой, строка преобразуется в символ.

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)
{
    const rb_method_entry_t *me;
    VALUE klass = rb_singleton_class_get(obj);
    ID id = rb_check_id(&vid);

    if (NIL_P(klass) || NIL_P(klass = RCLASS_ORIGIN(klass))) {
      undef:
        rb_name_err_raise("undefined singleton method `%1$s' for `%2$s'",
                          obj, vid);
    }
    if (!id) {
        if (respond_to_missing_p(klass, obj, vid, FALSE)) {
            id = rb_intern_str(vid);
            return mnew_missing(klass, obj, id, rb_cMethod);
        }
        goto undef;
    }
    me = rb_method_entry_at(klass, id);
    if (UNDEFINED_METHOD_ENTRY_P(me) ||
        UNDEFINED_REFINED_METHOD_P(me->def)) {
        vid = ID2SYM(id);
        goto undef;
    }
    return mnew_from_me(me, klass, klass, obj, id, rb_cMethod, FALSE);
}

Аналогично методу 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]);
    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_new();
    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]
sysread(io, size) Показать исходный код
# File lib/webrick/httpservlet/cgi_runner.rb, line 12
def sysread(io, size)
  buf = ""
  while size > 0
    tmp = io.sysread(size)
    buf << tmp
    size -= tmp.bytesize
  end
  return buf
end

cgi_runner.rb – запуск CGI.

Автор: IPR – Программирование в интернете с помощью Ruby – авторы Авторские права © 2000 TAKAHASHI Masayoshi, GOTOU YUUZOU Авторские права © 2002 авторы Программирования в интернете с помощью Ruby. Все права защищены.

$IPR: cgi_runner.rb,v 1.9 2002/09/25 11:33:15 gotoyuzo Exp $

taint → obj Показать исходный код
VALUE
rb_obj_taint(VALUE obj)
{
    if (!OBJ_TAINTED(obj) && OBJ_TAINTABLE(obj)) {
        rb_check_frozen(obj);
        OBJ_TAINT(obj);
    }
    return obj;
}

Пометить объект как испорченный.

Объекты, помеченные как испорченные, будут ограничены в использовании различных встроенных методов. Это сделано для предотвращения несанкционированного доступа к данным, таким как аргументы командной строки или строки, считанные из Kernel#gets, которые могут непреднамеренно нанести вред системе пользователя.

Чтобы проверить, является ли объект испорченным, используйте tainted?.

Вы должны размечать объект как неиспорченный только если ваш код проверил его и определил, что он безопасен. Для этого используйте untaint.

tainted? → true или false Показать исходный код
VALUE
rb_obj_tainted(VALUE obj)
{
    if (OBJ_TAINTED(obj))
        return Qtrue;
    return Qfalse;
}

Возвращает true, если объект испорчен.

См. taint для получения дополнительной информации.

tap {|x| блок } → obj Показать исходный код
VALUE
rb_obj_tap(VALUE obj)
{
    rb_yield(obj);
    return obj;
}

Передает self в блок, а затем возвращает self. Основное назначение этого метода — «вклиниться» в цепочку методов, чтобы выполнить операции над промежуточными результатами в цепочке.

(1..10)                  .tap {|x| puts "original: #{x}" }
  .to_a                  .tap {|x| puts "array:    #{x}" }
  .select {|x| x.even? } .tap {|x| puts "evens:    #{x}" }
  .map {|x| x*x }        .tap {|x| puts "squares:  #{x}" }
task(*) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/rake_compat.rb, line 40
def task(*)
  task = super

  if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
    non_namespaced_name = task.name.split(":").last

    description = non_namespaced_name
    description << task.arg_names.map { |n| n.to_s.upcase }.join(" ")
    description.strip!

    klass.desc description, Rake.application.last_description || non_namespaced_name
    Rake.application.last_description = nil
    klass.send :define_method, non_namespaced_name do |*args|
      Rake::Task[task.name.to_sym].invoke(*args)
    end
  end

  task
end
Вызывает метод суперкласса
then {|x| блок } → объект Показать исходный код
static VALUE
rb_obj_yield_self(VALUE obj)
{
    RETURN_SIZED_ENUMERATOR(obj, 0, 0, rb_obj_size);
    return rb_yield_values2(1, &obj);
}

Передает self в блок и возвращает результат блока.

3.next.then {|x| x**x }.to_s             #=> "256"
"my string".yield_self {|s| s.upcase }   #=> "MY STRING"

Хорошее использование yield_self — это передача значений в цепочках методов:

require 'open-uri'
require 'json'

construct_url(arguments).
  yield_self {|url| open(url).read }.
  yield_self {|response| JSON.parse(response) }

При вызове без блока метод возвращает Enumerator, что может быть использовано, например, для условного прерывания цепочки:

# meets condition, no-op
1.yield_self.detect(&:odd?)            # => 1
# does not meet condition, drop value
2.yield_self.detect(&:odd?)            # => nil
timeout(*args, &block) Показать исходный код
# File lib/timeout.rb, line 120
def timeout(*args, &block)
  warn "Object##{__method__} is deprecated, use Timeout.timeout instead.", uplevel: 1
  Timeout.timeout(*args, &block)
end
to_enum(method = :each, *args) → перечисление Показать исходный код
to_enum(method = :each, *args) {|*args| блок} → перечисление
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)

Обычно вызов 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_s → строка Показать исходный код
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);
    OBJ_INFECT(str, 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_warning("trust is deprecated and its behavior is same as untaint");
    return rb_obj_untaint(obj);
}

Устаревший метод, эквивалентный untaint.

untaint → obj Показать исходный код
VALUE
rb_obj_untaint(VALUE obj)
{
    if (OBJ_TAINTED(obj)) {
        rb_check_frozen(obj);
        FL_UNSET(obj, FL_TAINT);
    }
    return obj;
}

Удаляет метку «испорченный» с объекта.

См. taint для получения дополнительной информации.

untrust → obj Показать исходный код
VALUE
rb_obj_untrust(VALUE obj)
{
    rb_warning("untrust is deprecated and its behavior is same as taint");
    return rb_obj_taint(obj);
}

Устаревший метод, эквивалентный taint.

untrusted? → true или false Показать исходный код
VALUE
rb_obj_untrusted(VALUE obj)
{
    rb_warning("untrusted? is deprecated and its behavior is same as tainted?");
    return rb_obj_tainted(obj);
}

Устаревший метод, эквивалентный tainted?.

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 для получения дополнительной информации.

yield_self {|x| блок } → объект Показать исходный код
static VALUE
rb_obj_yield_self(VALUE obj)
{
    RETURN_SIZED_ENUMERATOR(obj, 0, 0, rb_obj_size);
    return rb_yield_values2(1, &obj);
}

Передаёт self в блок и возвращает результат блока.

3.next.then {|x| x**x }.to_s             #=> "256"
"my string".yield_self {|s| s.upcase }   #=> "MY STRING"

Хорошее применение для yield_self — это передача значений в цепочках методов:

require 'open-uri'
require 'json'

construct_url(arguments).
  yield_self {|url| open(url).read }.
  yield_self {|response| JSON.parse(response) }

При вызове без блока метод возвращает Enumerator, что может быть использовано, например, для условного прерывания цепочки:

# meets condition, no-op
1.yield_self.detect(&:odd?)            # => 1
# does not meet condition, drop value
2.yield_self.detect(&:odd?)            # => nil

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

Spec-Zone.ru

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