Add slice method to ENV like Hash#slice
[Feature #14559] From: Benoit Tigeot <benoit@hopsandfork.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63188 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
55d3ed4b9d
commit
9760a7f905
30
hash.c
30
hash.c
@ -4067,6 +4067,35 @@ env_keep_if(VALUE ehash)
|
|||||||
return envtbl;
|
return envtbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* ENV.slice(*keys) -> a_hash
|
||||||
|
*
|
||||||
|
* Returns a hash containing only the given keys from ENV and their values.
|
||||||
|
*
|
||||||
|
* ENV.slice("TERM","HOME") #=> {"TERM"=>"xterm-256color", "HOME"=>"/Users/rhc"}
|
||||||
|
*/
|
||||||
|
static VALUE
|
||||||
|
env_slice(int argc, VALUE *argv)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* ENV.clear
|
* ENV.clear
|
||||||
@ -4749,6 +4778,7 @@ Init_Hash(void)
|
|||||||
rb_define_singleton_method(envtbl, "delete", env_delete_m, 1);
|
rb_define_singleton_method(envtbl, "delete", env_delete_m, 1);
|
||||||
rb_define_singleton_method(envtbl, "delete_if", env_delete_if, 0);
|
rb_define_singleton_method(envtbl, "delete_if", env_delete_if, 0);
|
||||||
rb_define_singleton_method(envtbl, "keep_if", env_keep_if, 0);
|
rb_define_singleton_method(envtbl, "keep_if", env_keep_if, 0);
|
||||||
|
rb_define_singleton_method(envtbl, "slice", env_slice, -1);
|
||||||
rb_define_singleton_method(envtbl, "clear", rb_env_clear, 0);
|
rb_define_singleton_method(envtbl, "clear", rb_env_clear, 0);
|
||||||
rb_define_singleton_method(envtbl, "reject", env_reject, 0);
|
rb_define_singleton_method(envtbl, "reject", env_reject, 0);
|
||||||
rb_define_singleton_method(envtbl, "reject!", env_reject_bang, 0);
|
rb_define_singleton_method(envtbl, "reject!", env_reject_bang, 0);
|
||||||
|
@ -281,6 +281,17 @@ class TestEnv < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_slice
|
||||||
|
ENV.clear
|
||||||
|
ENV["foo"] = "bar"
|
||||||
|
ENV["baz"] = "qux"
|
||||||
|
ENV["bar"] = "rab"
|
||||||
|
assert_equal({}, ENV.slice())
|
||||||
|
assert_equal({}, ENV.slice(""))
|
||||||
|
assert_equal({}, ENV.slice("unknown"))
|
||||||
|
assert_equal({"foo"=>"bar", "baz"=>"qux"}, ENV.slice("foo", "baz"))
|
||||||
|
end
|
||||||
|
|
||||||
def test_clear
|
def test_clear
|
||||||
ENV.clear
|
ENV.clear
|
||||||
assert_equal(0, ENV.size)
|
assert_equal(0, ENV.size)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user