Spec-Zone.ru › Ruby 4.0

class ENV

Родитель:
Object

ENV — это средство доступа к переменным окружения, похожее на хеш.

Взаимодействие с операционной системой

Объект ENV взаимодействует с переменными окружения операционной системы:

  • При получении значения по имени в ENV оно извлекается из текущих переменных окружения.

  • При создании или установке пары имя-значение в ENV имя и значение немедленно устанавливаются в переменные окружения.

  • При удалении пары имя-значение из ENV она немедленно удаляется из переменных окружения.

Имена и значения

Обычно имя или значение — это String.

Допустимые имена и значения

Каждое имя или значение должно соответствовать одному из следующих условий:

  • Быть String.

  • Быть объектом, который отвечает на #to_str, возвращая String; в этом случае эта String будет использоваться как имя или значение.

Недопустимые имена и значения

Новое имя:

  • Не может быть пустой строкой:

    ENV[''] = '0'
    # Raises Errno::EINVAL (Invalid argument - ruby_setenv())
    
  • Не может содержать символ "=":

    ENV['='] = '0'
    # Raises Errno::EINVAL (Invalid argument - ruby_setenv(=))
    

Новое имя или значение:

  • Не может быть объектом, отличным от String, который не отвечает на #to_str:

    ENV['foo'] = Object.new
    # Raises TypeError (no implicit conversion of Object into String)
    ENV[Object.new] = '0'
    # Raises TypeError (no implicit conversion of Object into String)
    
  • Не может содержать нулевой символ "\0":

    ENV['foo'] = "\0"
    # Raises ArgumentError (bad environment variable value: contains null byte)
    ENV["\0"] == '0'
    # Raises ArgumentError (bad environment variable name: contains null byte)
    
  • Не может иметь кодировку, несовместимую с ASCII, например UTF-16LE или ISO-2022-JP:

    ENV['foo'] = '0'.force_encoding(Encoding::ISO_2022_JP)
    # Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: ISO-2022-JP)
    ENV["foo".force_encoding(Encoding::ISO_2022_JP)] = '0'
    # Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: ISO-2022-JP)
    

О порядке элементов

ENV перечисляет пары имя/значение в том порядке, в котором они указаны в переменных окружения операционной системы. Поэтому порядок элементов в ENV зависит от ОС и может быть неопределённым.

Это проявляется в:

  • Hash, возвращаемом методом ENV.

  • Enumerator, возвращаемом методом ENV.

  • Array, возвращаемом методами ENV.keys, ENV.values или ENV.to_a.

  • String, возвращаемой методом ENV.inspect.

  • Array, возвращаемом методом ENV.shift.

  • Имени, возвращаемом методом ENV.key.

Об этих примерах

Некоторые методы ENV возвращают сам объект ENV. Обычно переменных окружения много. В примерах ниже нет смысла выводить большой объект ENV, поэтому большинство фрагментов примеров начинается со сброса содержимого ENV:

  • ENV.replace заменяет ENV новой коллекцией записей.

  • ENV.clear очищает ENV.

Что здесь есть

Сначала о том, что находится в другом месте. Класс ENV:

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

  • Подключает модуль Enumerable.

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

  • Получения данных

  • Присваивания

  • Удаления

  • Перебора

  • Преобразования

  • И многого другого…

Методы получения данных

  • ::[]: возвращает значение указанной переменной окружения, если она существует:

  • ::empty?: возвращает, является ли ENV пустым.

  • ::has_value?, ::value?: возвращают, содержится ли указанное значение в ENV.

  • ::include?, ::has_key?, ::key?, ::member?: возвращают, содержится ли указанное имя в ENV.

  • ::key: возвращает имя первой записи с указанным значением.

  • ::size, ::length: возвращают количество записей.

  • ::value?: возвращает, есть ли запись с указанным значением.

Методы присваивания

  • ::[]=, ::store: создают, обновляют или удаляют указанную переменную окружения.

  • ::clear: удаляет все переменные окружения; возвращает ENV:

  • ::update, ::merge!: добавляют в ENV каждую пару ключ/значение из указанного хеша.

  • ::replace: заменяет всё содержимое ENV парами имя/значение из указанного хеша.

Методы удаления

  • ::delete: удаляет указанную переменную окружения, если она существует.

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

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

  • ::reject!: действует подобно delete_if, но возвращает nil, если изменений не было.

  • ::select!, ::filter!: удаляют записи, выбранные блоком.

  • ::shift: удаляет и возвращает первую запись.

Методы перебора

  • ::each, ::each_pair: вызывают блок для каждой пары имя/значение.

  • ::each_key: вызывают блок для каждого имени.

  • ::each_value: вызывают блок для каждого значения.

Методы преобразования

  • ::assoc: возвращает массив из двух элементов, содержащий имя и значение указанной переменной окружения, если она существует:

  • ::clone: вызывает исключение.

  • ::except: возвращает хеш всех пар имя/значение, кроме указанных.

  • ::fetch: возвращает значение по указанному имени.

  • ::inspect: возвращает содержимое ENV в виде строки.

  • ::invert: возвращает хеш, ключами которого являются значения ENV, а значениями — соответствующие имена ENV.

  • ::keys: возвращает массив всех имён.

  • ::rassoc: возвращает имя и значение первой найденной записи с указанным значением.

  • ::reject: возвращает хеш записей, не отклонённых блоком.

  • ::select, ::filter: возвращают хеш пар имя/значение, выбранных блоком.

  • ::slice: возвращает хеш указанных имён и соответствующих им значений.

  • ::to_a: возвращает записи в виде массива двухэлементных массивов.

  • ::to_h: возвращает хеш записей, выбранных блоком.

  • ::to_hash: возвращает хеш всех записей.

  • ::to_s: возвращает строку 'ENV'.

  • ::values: возвращает все значения в виде массива.

  • ::values_at: возвращает массив значений для указанного имени.

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

  • ::dup: вызывает исключение.

  • ::freeze: вызывает исключение.

  • ::rehash: возвращает nil, не изменяя ENV.

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

ENV[name] → value Показать исходный код
static VALUE
rb_f_getenv(VALUE obj, VALUE name)
{
    const char *nam = env_name(name);
    VALUE env = getenv_with_lock(nam);
    return env;
}

Возвращает значение переменной окружения name, если она существует:

ENV['foo'] = '0'
ENV['foo'] # => "0"

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

Вызывает исключение, если name недопустимо. См. раздел Недопустимые имена и значения.

ENV[name] = value → value Показать исходный код
store(name, value) → value
static VALUE
env_aset_m(VALUE obj, VALUE nm, VALUE val)
{
    return env_aset(nm, val);
}

Создаёт, обновляет или удаляет указанную переменную окружения и возвращает её значение. И name, и value могут быть экземплярами String. См. раздел Допустимые имена и значения.

  • Если переменная окружения с указанным именем не существует:

    • Если value — это nil, ничего не происходит.

      ENV.clear
      ENV['foo'] = nil # => nil
      ENV.include?('foo') # => false
      ENV.store('bar', nil) # => nil
      ENV.include?('bar') # => false
      
    • Если value — не nil, создаёт переменную окружения со значениями name и value:

      # Create 'foo' using ENV.[]=.
      ENV['foo'] = '0' # => '0'
      ENV['foo'] # => '0'
      # Create 'bar' using ENV.store.
      ENV.store('bar', '1') # => '1'
      ENV['bar'] # => '1'
      
  • Если переменная окружения с указанным именем существует:

    • Если value — не nil, обновляет переменную окружения, задавая ей значение value:

      # Update 'foo' using ENV.[]=.
      ENV['foo'] = '2' # => '2'
      ENV['foo'] # => '2'
      # Update 'bar' using ENV.store.
      ENV.store('bar', '3') # => '3'
      ENV['bar'] # => '3'
      
    • Если value — это nil, удаляет переменную окружения:

      # Delete 'foo' using ENV.[]=.
      ENV['foo'] = nil # => nil
      ENV.include?('foo') # => false
      # Delete 'bar' using ENV.store.
      ENV.store('bar', nil) # => nil
      ENV.include?('bar') # => false
      

Вызывает исключение, если name или value недопустимо. См. раздел Недопустимые имена и значения.

assoc(name) → [name, value] or nil Показать исходный код
static VALUE
env_assoc(VALUE env, VALUE key)
{
    const char *s = env_name(key);
    VALUE e = getenv_with_lock(s);

    if (!NIL_P(e)) {
        return rb_assoc_new(key, e);
    }
    else {
        return Qnil;
    }
}

Возвращает 2-элементный Array, содержащий имя и значение переменной окружения для name, если она существует:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.assoc('foo') # => ['foo', '0']

Возвращает nil, если name — допустимая String, но такой переменной окружения не существует.

Возвращает nil, если name — пустая String или String, содержащая символ '='.

Вызывает исключение, если name — это String, содержащая нулевой символ "\0":

ENV.assoc("\0") # Raises ArgumentError (bad environment variable name: contains null byte)

Вызывает исключение, если name имеет кодировку, несовместимую с ASCII:

ENV.assoc("\xa1\xa1".force_encoding(Encoding::UTF_16LE))
# Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: UTF-16LE)

Вызывает исключение, если name не является строкой:

ENV.assoc(Object.new) # TypeError (no implicit conversion of Object into String)
clear → ENV Показать исходный код
static VALUE
env_clear(VALUE _)
{
    return rb_env_clear();
}

Удаляет все переменные окружения и возвращает ENV:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.size # => 2
ENV.clear # => ENV
ENV.size # => 0
clone(freeze: nil) # raises TypeError Показать исходный код
static VALUE
env_clone(int argc, VALUE *argv, VALUE obj)
{
    if (argc) {
        VALUE opt;
        if (rb_scan_args(argc, argv, "0:", &opt) < argc) {
            rb_get_freeze_opt(1, &opt);
        }
    }

    rb_raise(rb_eTypeError, "Cannot clone ENV, use ENV.to_h to get a copy of ENV as a hash");
}

Вызывает TypeError, поскольку ENV — это оболочка для переменных окружения всего процесса, а её копия бесполезна. Используйте to_h, чтобы получить копию данных ENV в виде хеша.

delete(name) → value Показать исходный код
delete(name) { |name| block } → value
delete(missing_name) → nil
delete(missing_name) { |name| block } → block_value
static VALUE
env_delete_m(VALUE obj, VALUE name)
{
    VALUE val;

    val = env_delete(name);
    if (NIL_P(val) && rb_block_given_p()) val = rb_yield(name);
    return val;
}

Удаляет переменную окружения с именем name, если она существует, и возвращает её значение:

ENV['foo'] = '0'
ENV.delete('foo') # => '0'

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

Если блок задан, а переменная окружения не существует, передаёт name в блок и возвращает значение, возвращённое блоком:

ENV.delete('foo') { |name| name * 2 } # => "foofoo"

Если блок задан и переменная окружения существует, удаляет переменную окружения и возвращает её значение (блок игнорируется):

ENV['foo'] = '0'
ENV.delete('foo') { |name| raise 'ignored' } # => "0"

Вызывает исключение, если name недопустимо. См. раздел Недопустимые имена и значения.

delete_if { |name, value| block } → ENV Показать исходный код
delete_if → an_enumerator
static VALUE
env_delete_if(VALUE ehash)
{
    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    env_reject_bang(ehash);
    return envtbl;
}

Передаёт в блок имя каждой переменной окружения и её значение в виде 2-элементного Array, удаляет переменные окружения, для которых блок возвращает истинное значение, и возвращает ENV (независимо от того, были ли выполнены удаления):

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.delete_if { |name, value| name.start_with?('b') } # => ENV
ENV # => {"foo"=>"0"}
ENV.delete_if { |name, value| name.start_with?('b') } # => ENV

Если блок не задан, возвращает Enumerator:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.delete_if # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:delete_if!>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"foo"=>"0"}
e.each { |name, value| name.start_with?('b') } # => ENV
dup # raises TypeError Показать исходный код
static VALUE
env_dup(VALUE obj)
{
    rb_raise(rb_eTypeError, "Cannot dup ENV, use ENV.to_h to get a copy of ENV as a hash");
}

Вызывает TypeError, поскольку ENV — это объект-одиночка. Используйте to_h, чтобы получить копию данных ENV в виде хеша.

each { |name, value| block } → ENV Показать исходный код
each → an_enumerator
each_pair { |name, value| block } → ENV
each_pair → an_enumerator
static VALUE
env_each_pair(VALUE ehash)
{
    long i;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);

    VALUE ary = rb_ary_new();

    rb_encoding *enc = env_encoding();
    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);

        while (*env) {
            char *s = strchr(*env, '=');
            if (s) {
                rb_ary_push(ary, env_str_new(*env, s-*env, enc));
                rb_ary_push(ary, env_str_new2(s+1, enc));
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    if (rb_block_pair_yield_optimizable()) {
        for (i=0; i<RARRAY_LEN(ary); i+=2) {
            rb_yield_values(2, RARRAY_AREF(ary, i), RARRAY_AREF(ary, i+1));
        }
    }
    else {
        for (i=0; i<RARRAY_LEN(ary); i+=2) {
            rb_yield(rb_assoc_new(RARRAY_AREF(ary, i), RARRAY_AREF(ary, i+1)));
        }
    }

    return ehash;
}

Передаёт в блок имя каждой переменной окружения и её значение в виде 2-элементного Array:

h = {}
ENV.each_pair { |name, value| h[name] = value } # => ENV
h # => {"bar"=>"1", "foo"=>"0"}

Если блок не задан, возвращает Enumerator:

h = {}
e = ENV.each_pair # => #<Enumerator: {"bar"=>"1", "foo"=>"0"}:each_pair>
e.each { |name, value| h[name] = value } # => ENV
h # => {"bar"=>"1", "foo"=>"0"}
each_key { |name| block } → ENV Показать исходный код
each_key → an_enumerator
static VALUE
env_each_key(VALUE ehash)
{
    VALUE keys;
    long i;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    keys = env_keys(FALSE);
    for (i=0; i<RARRAY_LEN(keys); i++) {
        rb_yield(RARRAY_AREF(keys, i));
    }
    return ehash;
}

Передаёт в блок имя каждой переменной окружения:

ENV.replace('foo' => '0', 'bar' => '1') # => ENV
names = []
ENV.each_key { |name| names.push(name) } # => ENV
names # => ["bar", "foo"]

Если блок не задан, возвращает Enumerator:

e = ENV.each_key # => #<Enumerator: {"bar"=>"1", "foo"=>"0"}:each_key>
names = []
e.each { |name| names.push(name) } # => ENV
names # => ["bar", "foo"]
each { |name, value| block } → ENV Показать исходный код
each → an_enumerator
each_pair { |name, value| block } → ENV
each_pair → an_enumerator
static VALUE
env_each_pair(VALUE ehash)
{
    long i;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);

    VALUE ary = rb_ary_new();

    rb_encoding *enc = env_encoding();
    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);

        while (*env) {
            char *s = strchr(*env, '=');
            if (s) {
                rb_ary_push(ary, env_str_new(*env, s-*env, enc));
                rb_ary_push(ary, env_str_new2(s+1, enc));
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    if (rb_block_pair_yield_optimizable()) {
        for (i=0; i<RARRAY_LEN(ary); i+=2) {
            rb_yield_values(2, RARRAY_AREF(ary, i), RARRAY_AREF(ary, i+1));
        }
    }
    else {
        for (i=0; i<RARRAY_LEN(ary); i+=2) {
            rb_yield(rb_assoc_new(RARRAY_AREF(ary, i), RARRAY_AREF(ary, i+1)));
        }
    }

    return ehash;
}

Передаёт в блок имя каждой переменной окружения и её значение в виде 2-элементного Array:

h = {}
ENV.each_pair { |name, value| h[name] = value } # => ENV
h # => {"bar"=>"1", "foo"=>"0"}

Если блок не задан, возвращает Enumerator:

h = {}
e = ENV.each_pair # => #<Enumerator: {"bar"=>"1", "foo"=>"0"}:each_pair>
e.each { |name, value| h[name] = value } # => ENV
h # => {"bar"=>"1", "foo"=>"0"}
each_value { |value| block } → ENV Показать исходный код
each_value → an_enumerator
static VALUE
env_each_value(VALUE ehash)
{
    VALUE values;
    long i;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    values = env_values();
    for (i=0; i<RARRAY_LEN(values); i++) {
        rb_yield(RARRAY_AREF(values, i));
    }
    return ehash;
}

Передаёт в блок значение каждой переменной окружения:

ENV.replace('foo' => '0', 'bar' => '1') # => ENV
values = []
ENV.each_value { |value| values.push(value) } # => ENV
values # => ["1", "0"]

Если блок не задан, возвращает Enumerator:

e = ENV.each_value # => #<Enumerator: {"bar"=>"1", "foo"=>"0"}:each_value>
values = []
e.each { |value| values.push(value) } # => ENV
values # => ["1", "0"]
empty? → true or false Показать исходный код
static VALUE
env_empty_p(VALUE _)
{
    bool empty = true;

    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        if (env[0] != 0) {
            empty = false;
        }
        FREE_ENVIRON(environ);
    }

    return RBOOL(empty);
}

Возвращает true, если переменных окружения нет, и false в противном случае:

ENV.clear
ENV.empty? # => true
ENV['foo'] = '0'
ENV.empty? # => false
except(*keys) → a_hash Показать исходный код
static VALUE
env_except(int argc, VALUE *argv, VALUE _)
{
    int i;
    VALUE key, hash = env_to_hash();

    for (i = 0; i < argc; i++) {
        key = argv[i];
        rb_hash_delete(hash, key);
    }

    return hash;
}

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

ENV                       #=> {"LANG"=>"en_US.UTF-8", "TERM"=>"xterm-256color", "HOME"=>"/Users/rhc"}
ENV.except("TERM","HOME") #=> {"LANG"=>"en_US.UTF-8"}
fetch(name) → value Показать исходный код
fetch(name, default) → value
fetch(name) { |name| block } → value
static VALUE
env_fetch(int argc, VALUE *argv, VALUE _)
{
    VALUE key;
    long block_given;
    const char *nam;
    VALUE env;

    rb_check_arity(argc, 1, 2);
    key = argv[0];
    block_given = rb_block_given_p();
    if (block_given && argc == 2) {
        rb_warn("block supersedes default value argument");
    }
    nam = env_name(key);
    env = getenv_with_lock(nam);

    if (NIL_P(env)) {
        if (block_given) return rb_yield(key);
        if (argc == 1) {
            rb_key_err_raise(rb_sprintf("key not found: \"%"PRIsVALUE"\"", key), envtbl, key);
        }
        return argv[1];
    }
    return env;
}

Если name — имя переменной окружения, возвращает её значение:

ENV['foo'] = '0'
ENV.fetch('foo') # => '0'

В противном случае, если задан блок (но не значение по умолчанию), передаёт name в блок и возвращает значение, возвращённое блоком:

ENV.fetch('foo') { |name| :need_not_return_a_string } # => :need_not_return_a_string

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

ENV.delete('foo')
ENV.fetch('foo', :default_need_not_be_a_string) # => :default_need_not_be_a_string

Если переменная окружения не существует и заданы и значение по умолчанию, и блок, выводит предупреждение («warning: block supersedes default value argument»), передаёт name в блок и возвращает значение, возвращённое блоком:

ENV.fetch('foo', :default) { |name| :block_return } # => :block_return

Вызывает KeyError, если name допустимо, но не найдено, а значение по умолчанию и блок не заданы:

ENV.fetch('foo') # Raises KeyError (key not found: "foo")

Вызывает исключение, если name недопустимо. См. раздел Недопустимые имена и значения.

select { |name, value| block } → hash of name/value pairs Показать исходный код
select → an_enumerator
filter { |name, value| block } → hash of name/value pairs
filter → an_enumerator
static VALUE
env_select(VALUE ehash)
{
    VALUE result;
    VALUE keys;
    long i;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    result = rb_hash_new();
    keys = env_keys(FALSE);
    for (i = 0; i < RARRAY_LEN(keys); ++i) {
        VALUE key = RARRAY_AREF(keys, i);
        VALUE val = rb_f_getenv(Qnil, key);
        if (!NIL_P(val)) {
            if (RTEST(rb_yield_values(2, key, val))) {
                rb_hash_aset(result, key, val);
            }
        }
    }
    RB_GC_GUARD(keys);

    return result;
}

Передаёт в блок имя каждой переменной окружения и её значение в виде 2-элементного Array и возвращает Hash с именами и значениями, для которых блок возвращает истинное значение:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.select { |name, value| name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}
ENV.filter { |name, value| name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}

Если блок не задан, возвращает Enumerator:

e = ENV.select # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:select>
e.each { |name, value | name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}
e = ENV.filter # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:filter>
e.each { |name, value | name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}
select! { |name, value| block } → ENV or nil Показать исходный код
select! → an_enumerator
filter! { |name, value| block } → ENV or nil
filter! → an_enumerator
static VALUE
env_select_bang(VALUE ehash)
{
    VALUE keys;
    long i;
    int del = 0;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    keys = env_keys(FALSE);
    RBASIC_CLEAR_CLASS(keys);
    for (i=0; i<RARRAY_LEN(keys); i++) {
        VALUE val = rb_f_getenv(Qnil, RARRAY_AREF(keys, i));
        if (!NIL_P(val)) {
            if (!RTEST(rb_yield_values(2, RARRAY_AREF(keys, i), val))) {
                env_delete(RARRAY_AREF(keys, i));
                del++;
            }
        }
    }
    RB_GC_GUARD(keys);
    if (del == 0) return Qnil;
    return envtbl;
}

Передаёт в блок имя каждой переменной окружения и её значение в виде 2-элементного Array, удаляет каждую запись, для которой блок возвращает false или nil, и возвращает ENV, если были выполнены удаления, либо nil в противном случае:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.select! { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
ENV.select! { |name, value| true } # => nil

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.filter! { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
ENV.filter! { |name, value| true } # => nil

Если блок не задан, возвращает Enumerator:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.select! # => #<Enumerator: {"bar"=>"1", "baz"=>"2"}:select!>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
e.each { |name, value| true } # => nil

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.filter! # => #<Enumerator: {"bar"=>"1", "baz"=>"2"}:filter!>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
e.each { |name, value| true } # => nil
freeze Показать исходный код
static VALUE
env_freeze(VALUE self)
{
    rb_raise(rb_eTypeError, "cannot freeze ENV");
    UNREACHABLE_RETURN(self);
}

Вызывает исключение:

ENV.freeze # Raises TypeError (cannot freeze ENV)
include?(name) → true or false Показать исходный код
has_key?(name) → true or false
member?(name) → true or false
key?(name) → true or false
static VALUE
env_has_key(VALUE env, VALUE key)
{
    const char *s = env_name(key);
    return RBOOL(has_env_with_lock(s));
}

Возвращает true, если существует переменная окружения с указанным name:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.include?('foo') # => true

Возвращает false, если name — допустимая String, но такой переменной окружения не существует:

ENV.include?('baz') # => false

Возвращает false, если name — пустая String или String, содержащая символ '=':

ENV.include?('') # => false
ENV.include?('=') # => false

Вызывает исключение, если name — это String, содержащая нулевой символ "\0":

ENV.include?("\0") # Raises ArgumentError (bad environment variable name: contains null byte)

Вызывает исключение, если name имеет кодировку, несовместимую с ASCII:

ENV.include?("\xa1\xa1".force_encoding(Encoding::UTF_16LE))
# Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: UTF-16LE)

Вызывает исключение, если name не является строкой:

ENV.include?(Object.new) # TypeError (no implicit conversion of Object into String)
value?(value) → true or false Показать исходный код
has_value?(value) → true or false
static VALUE
env_has_value(VALUE dmy, VALUE obj)
{
    obj = rb_check_string_type(obj);
    if (NIL_P(obj)) return Qnil;

    VALUE ret = Qfalse;

    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        while (*env) {
            char *s = strchr(*env, '=');
            if (s++) {
                long len = strlen(s);
                if (RSTRING_LEN(obj) == len && strncmp(s, RSTRING_PTR(obj), len) == 0) {
                    ret = Qtrue;
                    break;
                }
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    return ret;
}

Возвращает true, если value является значением какой-либо переменной окружения, и false в противном случае:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.value?('0') # => true
ENV.has_value?('0') # => true
ENV.value?('2') # => false
ENV.has_value?('2') # => false
include?(name) → true or false Показать исходный код
has_key?(name) → true or false
member?(name) → true or false
key?(name) → true or false
static VALUE
env_has_key(VALUE env, VALUE key)
{
    const char *s = env_name(key);
    return RBOOL(has_env_with_lock(s));
}

Возвращает true, если существует переменная окружения с указанным name:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.include?('foo') # => true

Возвращает false, если name — допустимая String, но такой переменной окружения не существует:

ENV.include?('baz') # => false

Возвращает false, если name — пустая String или String, содержащая символ '=':

ENV.include?('') # => false
ENV.include?('=') # => false

Вызывает исключение, если name — это String, содержащая нулевой символ "\0":

ENV.include?("\0") # Raises ArgumentError (bad environment variable name: contains null byte)

Вызывает исключение, если name имеет кодировку, несовместимую с ASCII:

ENV.include?("\xa1\xa1".force_encoding(Encoding::UTF_16LE))
# Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: UTF-16LE)

Вызывает исключение, если name не является строкой:

ENV.include?(Object.new) # TypeError (no implicit conversion of Object into String)
inspect → a_string Показать исходный код
static VALUE
env_inspect(VALUE _)
{
    VALUE str = rb_str_buf_new2("{");
    rb_encoding *enc = env_encoding();

    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        while (*env) {
            const char *s = strchr(*env, '=');

            if (env != environ) {
                rb_str_buf_cat2(str, ", ");
            }
            if (s) {
                rb_str_buf_append(str, rb_str_inspect(env_enc_str_new(*env, s-*env, enc)));
                rb_str_buf_cat2(str, " => ");
                s++;
                rb_str_buf_append(str, rb_str_inspect(env_enc_str_new(s, strlen(s), enc)));
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    rb_str_buf_cat2(str, "}");

    return str;
}

Возвращает содержимое окружения в виде строки:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.inspect # => "{\"bar\"=>\"1\", \"foo\"=>\"0\"}"
invert → hash of value/name pairs Показать исходный код
static VALUE
env_invert(VALUE _)
{
    return rb_hash_invert(env_to_hash());
}

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

ENV.replace('foo' => '0', 'bar' => '1')
ENV.invert # => {"1"=>"bar", "0"=>"foo"}

Для повторяющегося значения ENV перезаписывает запись в хеше:

ENV.replace('foo' => '0', 'bar' => '0')
ENV.invert # => {"0"=>"foo"}

Обратите внимание, что порядок обработки ENV зависит от ОС, поэтому порядок перезаписи также зависит от ОС. См. раздел О порядке.

keep_if { |name, value| block } → ENV Показать исходный код
keep_if → an_enumerator
static VALUE
env_keep_if(VALUE ehash)
{
    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    env_select_bang(ehash);
    return envtbl;
}

Передаёт в блок имя каждой переменной окружения и её значение в виде 2-элементного Array, удаляет переменные окружения, для которых блок возвращает false или nil, и возвращает ENV:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.keep_if { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}

Если блок не задан, возвращает Enumerator:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.keep_if # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:keep_if>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
key(value) → name or nil Показать исходный код
static VALUE
env_key(VALUE dmy, VALUE value)
{
    StringValue(value);
    VALUE str = Qnil;

    rb_encoding *enc = env_encoding();
    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        while (*env) {
            char *s = strchr(*env, '=');
            if (s++) {
                long len = strlen(s);
                if (RSTRING_LEN(value) == len && strncmp(s, RSTRING_PTR(value), len) == 0) {
                    str = env_str_new(*env, s-*env-1, enc);
                    break;
                }
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    return str;
}

Возвращает имя первой переменной окружения со значением value, если она существует:

ENV.replace('foo' => '0', 'bar' => '0')
ENV.key('0') # => "foo"

Порядок проверки переменных окружения зависит от ОС. См. раздел О порядке.

Возвращает nil, если такого значения нет.

Вызывает исключение, если value недопустимо:

ENV.key(Object.new) # raises TypeError (no implicit conversion of Object into String)

См. раздел Недопустимые имена и значения.

include?(name) → true or false Показать исходный код
has_key?(name) → true or false
member?(name) → true or false
key?(name) → true or false
static VALUE
env_has_key(VALUE env, VALUE key)
{
    const char *s = env_name(key);
    return RBOOL(has_env_with_lock(s));
}

Возвращает true, если существует переменная окружения с указанным name:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.include?('foo') # => true

Возвращает false, если name — допустимая String, но такой переменной окружения не существует:

ENV.include?('baz') # => false

Возвращает false, если name — пустая String или String, содержащая символ '=':

ENV.include?('') # => false
ENV.include?('=') # => false

Вызывает исключение, если name — это String, содержащая нулевой символ "\0":

ENV.include?("\0") # Raises ArgumentError (bad environment variable name: contains null byte)

Вызывает исключение, если name имеет кодировку, несовместимую с ASCII:

ENV.include?("\xa1\xa1".force_encoding(Encoding::UTF_16LE))
# Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: UTF-16LE)

Вызывает исключение, если name не является строкой:

ENV.include?(Object.new) # TypeError (no implicit conversion of Object into String)
keys → array of names Показать исходный код
static VALUE
env_f_keys(VALUE _)
{
    return env_keys(FALSE);
}

Возвращает все имена переменных в массиве:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.keys # => ['bar', 'foo']

Порядок имён зависит от ОС. См. раздел О порядке.

Если ENV пуст, возвращает пустой Array.

length → an_integer Показать исходный код
size → an_integer
static VALUE
env_size(VALUE _)
{
    return INT2FIX(env_size_with_lock());
}

Возвращает количество переменных окружения:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.length # => 2
ENV.size # => 2
include?(name) → истина или ложь Показать исходный код
has_key?(name) → истина или ложь
member?(name) → истина или ложь
key?(name) → истина или ложь
static VALUE
env_has_key(VALUE env, VALUE key)
{
    const char *s = env_name(key);
    return RBOOL(has_env_with_lock(s));
}

Возвращает true, если существует переменная окружения с заданным именем name:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.include?('foo') # => true

Возвращает false, если name является допустимой String и такой переменной окружения не существует:

ENV.include?('baz') # => false

Возвращает false, если name — пустая String или String, содержащая символ '=':

ENV.include?('') # => false
ENV.include?('=') # => false

Вызывает исключение, если name — String, содержащая нулевой символ "\0":

ENV.include?("\0") # Raises ArgumentError (bad environment variable name: contains null byte)

Вызывает исключение, если у name кодировка несовместима с ASCII:

ENV.include?("\xa1\xa1".force_encoding(Encoding::UTF_16LE))
# Raises ArgumentError (bad environment variable name: ASCII incompatible encoding: UTF-16LE)

Вызывает исключение, если name не является строкой:

ENV.include?(Object.new) # TypeError (no implicit conversion of Object into String)
update → ENV Показать исходный код
update(*hashes) → ENV
update(*hashes) { |name, env_val, hash_val| block } → ENV
merge! → ENV
merge!(*hashes) → ENV
merge!(*hashes) { |name, env_val, hash_val| block } → ENV
static VALUE
env_update(int argc, VALUE *argv, VALUE env)
{
    rb_foreach_func *func = rb_block_given_p() ?
        env_update_block_i : env_update_i;
    for (int i = 0; i < argc; ++i) {
        VALUE hash = argv[i];
        if (env == hash) continue;
        hash = to_hash(hash);
        rb_hash_foreach(hash, func, 0);
    }
    return env;
}

Добавляет в ENV каждую пару ключ/значение из заданного hash; возвращает ENV:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.merge!('baz' => '2', 'bat' => '3') # => {"bar"=>"1", "bat"=>"3", "baz"=>"2", "foo"=>"0"}

Удаляет запись из ENV, если значением в хеше является nil:

ENV.merge!('baz' => nil, 'bat' => nil) # => {"bar"=>"1", "foo"=>"0"}

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

ENV.merge!('foo' => '4') # => {"bar"=>"1", "foo"=>"4"}

Если имя уже существует и блок задан, передаёт ему имя, значение в ENV и значение в хеше; возвращаемое блоком значение становится новым именем:

ENV.merge!('foo' => '5') { |name, env_val, hash_val | env_val + hash_val } # => {"bar"=>"1", "foo"=>"45"}

Вызывает исключение, если имя или значение недопустимо (см. Недопустимые имена и значения);

ENV.replace('foo' => '0', 'bar' => '1')
ENV.merge!('foo' => '6', :bar => '7', 'baz' => '9') # Raises TypeError (no implicit conversion of Symbol into String)
ENV # => {"bar"=>"1", "foo"=>"6"}
ENV.merge!('foo' => '7', 'bar' => 8, 'baz' => '9') # Raises TypeError (no implicit conversion of Integer into String)
ENV # => {"bar"=>"1", "foo"=>"7"}

Вызывает исключение, если блок возвращает недопустимое имя (см. Недопустимые имена и значения):

ENV.merge!('bat' => '8', 'foo' => '9') { |name, env_val, hash_val | 10 } # Raises TypeError (no implicit conversion of Integer into String)
ENV # => {"bar"=>"1", "bat"=>"8", "foo"=>"7"}

Обратите внимание: в приведённых выше случаях пары хеша, расположенные перед недопустимым именем или значением, обрабатываются обычным образом; последующие пары игнорируются.

rassoc(value) → [name, value] или nil Показать исходный код
static VALUE
env_rassoc(VALUE dmy, VALUE obj)
{
    obj = rb_check_string_type(obj);
    if (NIL_P(obj)) return Qnil;

    VALUE result = Qnil;

    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);

        while (*env) {
            const char *p = *env;
            char *s = strchr(p, '=');
            if (s++) {
                long len = strlen(s);
                if (RSTRING_LEN(obj) == len && strncmp(s, RSTRING_PTR(obj), len) == 0) {
                    result = rb_assoc_new(rb_str_new(p, s-p-1), obj);
                    break;
                }
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    return result;
}

Возвращает 2-элементный Array, содержащий имя и значение первой найденной переменной окружения со значением value, если такая переменная существует:

ENV.replace('foo' => '0', 'bar' => '0')
ENV.rassoc('0') # => ["bar", "0"]

Порядок проверки переменных окружения зависит от операционной системы. См. О порядке элементов.

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

rehash → nil Показать исходный код
static VALUE
env_none(VALUE _)
{
    return Qnil;
}

(Предоставлен для совместимости с Hash.)

Не изменяет ENV; возвращает nil.

reject { |name, value| block } → хеш пар имя/значение Показать исходный код
reject → перечислитель
static VALUE
env_reject(VALUE _)
{
    return rb_hash_delete_if(env_to_hash());
}

Передаёт блоку имя и значение каждой переменной окружения в виде 2-элементного Array. Возвращает Hash, элементы которого определяются блоком. Если блок возвращает истинное значение, пара имя/значение добавляется в возвращаемый Hash; в противном случае пара игнорируется:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.reject { |name, value| name.start_with?('b') } # => {"foo"=>"0"}

Если блок не задан, возвращает Enumerator:

e = ENV.reject
e.each { |name, value| name.start_with?('b') } # => {"foo"=>"0"}
reject! { |name, value| block } → ENV или nil Показать исходный код
reject! → перечислитель
static VALUE
env_reject_bang(VALUE ehash)
{
    VALUE keys;
    long i;
    int del = 0;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    keys = env_keys(FALSE);
    RBASIC_CLEAR_CLASS(keys);
    for (i=0; i<RARRAY_LEN(keys); i++) {
        VALUE val = rb_f_getenv(Qnil, RARRAY_AREF(keys, i));
        if (!NIL_P(val)) {
            if (RTEST(rb_yield_values(2, RARRAY_AREF(keys, i), val))) {
                env_delete(RARRAY_AREF(keys, i));
                del++;
            }
        }
    }
    RB_GC_GUARD(keys);
    if (del == 0) return Qnil;
    return envtbl;
}

Аналогичен ENV.delete_if, но возвращает nil, если изменений не было.

Передаёт блоку имя и значение каждой переменной окружения в виде 2-элементного Array, удаляет каждую переменную окружения, для которой блок возвращает истинное значение, и возвращает ENV (если были удаления) или nil (если их не было):

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.reject! { |name, value| name.start_with?('b') } # => ENV
ENV # => {"foo"=>"0"}
ENV.reject! { |name, value| name.start_with?('b') } # => nil

Если блок не задан, возвращает Enumerator:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.reject! # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:reject!>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"foo"=>"0"}
e.each { |name, value| name.start_with?('b') } # => nil
replace(hash) → ENV Показать исходный код
static VALUE
env_replace(VALUE env, VALUE hash)
{
    VALUE keys;
    long i;

    keys = env_keys(TRUE);
    if (env == hash) return env;
    hash = to_hash(hash);
    rb_hash_foreach(hash, env_replace_i, keys);

    for (i=0; i<RARRAY_LEN(keys); i++) {
        env_delete(RARRAY_AREF(keys, i));
    }
    RB_GC_GUARD(keys);
    return env;
}

Заменяет всё содержимое переменных окружения парами имя/значение из заданного hash; возвращает ENV.

Заменяет содержимое ENV заданными парами:

ENV.replace('foo' => '0', 'bar' => '1') # => ENV
ENV.to_hash # => {"bar"=>"1", "foo"=>"0"}

Вызывает исключение, если имя или значение недопустимо (см. Недопустимые имена и значения):

ENV.replace('foo' => '0', :bar => '1') # Raises TypeError (no implicit conversion of Symbol into String)
ENV.replace('foo' => '0', 'bar' => 1) # Raises TypeError (no implicit conversion of Integer into String)
ENV.to_hash # => {"bar"=>"1", "foo"=>"0"}
select { |name, value| block } → хеш пар имя/значение Показать исходный код
select → перечислитель
filter { |name, value| block } → хеш пар имя/значение
filter → перечислитель
static VALUE
env_select(VALUE ehash)
{
    VALUE result;
    VALUE keys;
    long i;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    result = rb_hash_new();
    keys = env_keys(FALSE);
    for (i = 0; i < RARRAY_LEN(keys); ++i) {
        VALUE key = RARRAY_AREF(keys, i);
        VALUE val = rb_f_getenv(Qnil, key);
        if (!NIL_P(val)) {
            if (RTEST(rb_yield_values(2, key, val))) {
                rb_hash_aset(result, key, val);
            }
        }
    }
    RB_GC_GUARD(keys);

    return result;
}

Передаёт блоку имя и значение каждой переменной окружения в виде 2-элементного Array и возвращает Hash с именами и значениями, для которых блок возвращает истинное значение:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.select { |name, value| name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}
ENV.filter { |name, value| name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}

Если блок не задан, возвращает Enumerator:

e = ENV.select # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:select>
e.each { |name, value | name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}
e = ENV.filter # => #<Enumerator: {"bar"=>"1", "baz"=>"2", "foo"=>"0"}:filter>
e.each { |name, value | name.start_with?('b') } # => {"bar"=>"1", "baz"=>"2"}
select! { |name, value| block } → ENV или nil Показать исходный код
select! → перечислитель
filter! { |name, value| block } → ENV или nil
filter! → перечислитель
static VALUE
env_select_bang(VALUE ehash)
{
    VALUE keys;
    long i;
    int del = 0;

    RETURN_SIZED_ENUMERATOR(ehash, 0, 0, rb_env_size);
    keys = env_keys(FALSE);
    RBASIC_CLEAR_CLASS(keys);
    for (i=0; i<RARRAY_LEN(keys); i++) {
        VALUE val = rb_f_getenv(Qnil, RARRAY_AREF(keys, i));
        if (!NIL_P(val)) {
            if (!RTEST(rb_yield_values(2, RARRAY_AREF(keys, i), val))) {
                env_delete(RARRAY_AREF(keys, i));
                del++;
            }
        }
    }
    RB_GC_GUARD(keys);
    if (del == 0) return Qnil;
    return envtbl;
}

Передаёт блоку имя и значение каждой переменной окружения в виде 2-элементного Array, удаляет каждую запись, для которой блок возвращает false или nil, и возвращает ENV, если были удаления, или nil в противном случае:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.select! { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
ENV.select! { |name, value| true } # => nil

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.filter! { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
ENV.filter! { |name, value| true } # => nil

Если блок не задан, возвращает Enumerator:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.select! # => #<Enumerator: {"bar"=>"1", "baz"=>"2"}:select!>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
e.each { |name, value| true } # => nil

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
e = ENV.filter! # => #<Enumerator: {"bar"=>"1", "baz"=>"2"}:filter!>
e.each { |name, value| name.start_with?('b') } # => ENV
ENV # => {"bar"=>"1", "baz"=>"2"}
e.each { |name, value| true } # => nil
shift → [name, value] или nil Показать исходный код
static VALUE
env_shift(VALUE _)
{
    VALUE result = Qnil;
    VALUE key = Qnil;

    rb_encoding *enc = env_encoding();
    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        if (*env) {
            const char *p = *env;
            char *s = strchr(p, '=');
            if (s) {
                key = env_str_new(p, s-p, enc);
                VALUE val = env_str_new2(getenv(RSTRING_PTR(key)), enc);
                result = rb_assoc_new(key, val);
            }
        }
        FREE_ENVIRON(environ);
    }

    if (!NIL_P(key)) {
        env_delete(key);
    }

    return result;
}

Удаляет первую переменную окружения из ENV и возвращает 2-элементный Array, содержащий её имя и значение:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.to_hash # => {'bar' => '1', 'foo' => '0'}
ENV.shift # => ['bar', '1']
ENV.to_hash # => {'foo' => '0'}

То, какая переменная окружения считается «первой», зависит от операционной системы. См. О порядке элементов.

Возвращает nil, если окружение пусто.

length → целое число Показать исходный код
size → целое число
static VALUE
env_size(VALUE _)
{
    return INT2FIX(env_size_with_lock());
}

Возвращает количество переменных окружения:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.length # => 2
ENV.size # => 2
slice(*names) → хеш пар имя/значение Показать исходный код
static VALUE
env_slice(int argc, VALUE *argv, VALUE _)
{
    int i;
    VALUE key, value, result;

    if (argc == 0) {
        return rb_hash_new();
    }
    result = rb_hash_new_with_size(argc);

    for (i = 0; i < argc; i++) {
        key = argv[i];
        value = rb_f_getenv(Qnil, key);
        if (value != Qnil)
            rb_hash_aset(result, key, value);
    }

    return result;
}

Возвращает Hash с заданными именами ENV и соответствующими им значениями:

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2', 'bat' => '3')
ENV.slice('foo', 'baz') # => {"foo"=>"0", "baz"=>"2"}
ENV.slice('baz', 'foo') # => {"baz"=>"2", "foo"=>"0"}

Вызывает исключение, если любое из names недопустимо (см. Недопустимые имена и значения):

ENV.slice('foo', 'bar', :bat) # Raises TypeError (no implicit conversion of Symbol into String)
ENV[name] = value → value Показать исходный код
store(name, value) → value
static VALUE
env_aset_m(VALUE obj, VALUE nm, VALUE val)
{
    return env_aset(nm, val);
}

Создаёт, обновляет или удаляет именованную переменную окружения и возвращает значение. И name, и value могут быть экземплярами String. См. Допустимые имена и значения.

  • Если именованная переменная окружения не существует:

    • Если value равно nil, ничего не делает.

      ENV.clear
      ENV['foo'] = nil # => nil
      ENV.include?('foo') # => false
      ENV.store('bar', nil) # => nil
      ENV.include?('bar') # => false
      
    • Если value не равно nil, создаёт переменную окружения с name и value:

      # Create 'foo' using ENV.[]=.
      ENV['foo'] = '0' # => '0'
      ENV['foo'] # => '0'
      # Create 'bar' using ENV.store.
      ENV.store('bar', '1') # => '1'
      ENV['bar'] # => '1'
      
  • Если именованная переменная окружения существует:

    • Если value не равно nil, обновляет переменную окружения, задавая значение value:

      # Update 'foo' using ENV.[]=.
      ENV['foo'] = '2' # => '2'
      ENV['foo'] # => '2'
      # Update 'bar' using ENV.store.
      ENV.store('bar', '3') # => '3'
      ENV['bar'] # => '3'
      
    • Если value равно nil, удаляет переменную окружения:

      # Delete 'foo' using ENV.[]=.
      ENV['foo'] = nil # => nil
      ENV.include?('foo') # => false
      # Delete 'bar' using ENV.store.
      ENV.store('bar', nil) # => nil
      ENV.include?('bar') # => false
      

Вызывает исключение, если name или value недопустимо. См. Недопустимые имена и значения.

to_a → массив 2-элементных массивов Показать исходный код
static VALUE
env_to_a(VALUE _)
{
    VALUE ary = rb_ary_new();

    rb_encoding *enc = env_encoding();
    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        while (*env) {
            char *s = strchr(*env, '=');
            if (s) {
                rb_ary_push(ary, rb_assoc_new(env_str_new(*env, s-*env, enc),
                                              env_str_new2(s+1, enc)));
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    return ary;
}

Возвращает содержимое ENV в виде Array из 2-элементных массивов, каждый из которых представляет собой пару имя/значение:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.to_a # => [["bar", "1"], ["foo", "0"]]
to_h → хеш пар имя/значение Показать исходный код
to_h {|name, value| block } → хеш пар имя/значение
static VALUE
env_to_h(VALUE _)
{
    VALUE hash = env_to_hash();
    if (rb_block_given_p()) {
        hash = rb_hash_to_h_block(hash);
    }
    return hash;
}

Если блок не задан, возвращает Hash, содержащий все пары имя/значение из ENV:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.to_h # => {"bar"=>"1", "foo"=>"0"}

Если блок задан, возвращает Hash, элементы которого определяются блоком. Каждая пара имя/значение из ENV передаётся блоку. Блок должен вернуть 2-элементный Array (пару имя/значение), которая добавляется в возвращаемый Hash в качестве ключа и значения:

ENV.to_h { |name, value| [name.to_sym, value.to_i] } # => {bar: 1, foo: 0}

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

ENV.to_h { |name, value| name } # Raises TypeError (wrong element type String (expected array))

Вызывает исключение, если блок возвращает Array неправильного размера:

ENV.to_h { |name, value| [name] } # Raises ArgumentError (element has wrong array length (expected 2, was 1))
to_hash → хеш пар имя/значение Показать исходный код
static VALUE
env_f_to_hash(VALUE _)
{
    return env_to_hash();
}

Возвращает Hash, содержащий все пары имя/значение из ENV:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.to_hash # => {"bar"=>"1", "foo"=>"0"}
to_s → "ENV" Показать исходный код
static VALUE
env_to_s(VALUE _)
{
    return rb_usascii_str_new2("ENV");
}

Возвращает String ‘ENV’:

ENV.to_s # => "ENV"
update → ENV Показать исходный код
update(*hashes) → ENV
update(*hashes) { |name, env_val, hash_val| block } → ENV
merge! → ENV
merge!(*hashes) → ENV
merge!(*hashes) { |name, env_val, hash_val| block } → ENV
static VALUE
env_update(int argc, VALUE *argv, VALUE env)
{
    rb_foreach_func *func = rb_block_given_p() ?
        env_update_block_i : env_update_i;
    for (int i = 0; i < argc; ++i) {
        VALUE hash = argv[i];
        if (env == hash) continue;
        hash = to_hash(hash);
        rb_hash_foreach(hash, func, 0);
    }
    return env;
}

Добавляет в ENV каждую пару ключ/значение из заданного hash; возвращает ENV:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.merge!('baz' => '2', 'bat' => '3') # => {"bar"=>"1", "bat"=>"3", "baz"=>"2", "foo"=>"0"}

Удаляет запись из ENV, если значением в хеше является nil:

ENV.merge!('baz' => nil, 'bat' => nil) # => {"bar"=>"1", "foo"=>"0"}

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

ENV.merge!('foo' => '4') # => {"bar"=>"1", "foo"=>"4"}

Если имя уже существует и блок задан, передаёт ему имя, значение в ENV и значение в хеше; возвращаемое блоком значение становится новым именем:

ENV.merge!('foo' => '5') { |name, env_val, hash_val | env_val + hash_val } # => {"bar"=>"1", "foo"=>"45"}

Вызывает исключение, если имя или значение недопустимо (см. Недопустимые имена и значения);

ENV.replace('foo' => '0', 'bar' => '1')
ENV.merge!('foo' => '6', :bar => '7', 'baz' => '9') # Raises TypeError (no implicit conversion of Symbol into String)
ENV # => {"bar"=>"1", "foo"=>"6"}
ENV.merge!('foo' => '7', 'bar' => 8, 'baz' => '9') # Raises TypeError (no implicit conversion of Integer into String)
ENV # => {"bar"=>"1", "foo"=>"7"}

Вызывает исключение, если блок возвращает недопустимое имя (см. Недопустимые имена и значения):

ENV.merge!('bat' => '8', 'foo' => '9') { |name, env_val, hash_val | 10 } # Raises TypeError (no implicit conversion of Integer into String)
ENV # => {"bar"=>"1", "bat"=>"8", "foo"=>"7"}

Обратите внимание: в приведённых выше случаях пары хеша, расположенные перед недопустимым именем или значением, обрабатываются обычным образом; последующие пары игнорируются.

value?(value) → истина или ложь Показать исходный код
has_value?(value) → истина или ложь
static VALUE
env_has_value(VALUE dmy, VALUE obj)
{
    obj = rb_check_string_type(obj);
    if (NIL_P(obj)) return Qnil;

    VALUE ret = Qfalse;

    ENV_LOCKING() {
        char **env = GET_ENVIRON(environ);
        while (*env) {
            char *s = strchr(*env, '=');
            if (s++) {
                long len = strlen(s);
                if (RSTRING_LEN(obj) == len && strncmp(s, RSTRING_PTR(obj), len) == 0) {
                    ret = Qtrue;
                    break;
                }
            }
            env++;
        }
        FREE_ENVIRON(environ);
    }

    return ret;
}

Возвращает true, если value является значением для какого-либо имени переменной окружения, и false в противном случае:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.value?('0') # => true
ENV.has_value?('0') # => true
ENV.value?('2') # => false
ENV.has_value?('2') # => false
values → массив значений Показать исходный код
static VALUE
env_f_values(VALUE _)
{
    return env_values();
}

Возвращает все значения переменных окружения в массиве:

ENV.replace('foo' => '0', 'bar' => '1')
ENV.values # => ['1', '0']

Порядок значений зависит от операционной системы. См. О порядке элементов.

Возвращает пустой Array, если ENV пусто.

values_at(*names) → массив значений Показать исходный код
static VALUE
env_values_at(int argc, VALUE *argv, VALUE _)
{
    VALUE result;
    long i;

    result = rb_ary_new();
    for (i=0; i<argc; i++) {
        rb_ary_push(result, rb_f_getenv(Qnil, argv[i]));
    }
    return result;
}

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

ENV.replace('foo' => '0', 'bar' => '1', 'baz' => '2')
ENV.values_at('foo', 'baz') # => ["0", "2"]

Возвращает nil в Array для каждого имени, которое не является допустимым именем ENV:

ENV.values_at('foo', 'bat', 'bar', 'bam') # => ["0", nil, "1", nil]

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

Вызывает исключение, если какое-либо имя недопустимо. См. Недопустимые имена и значения.

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

Spec-Zone.ru

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