为什么ENV表现得像哈希,但它是一个Object类

时间:2011-07-22 13:35:47

标签: ruby

我是否认为ENV是哈希

ENV['HOME']

=>'/Users/yozloy'

但是

ENV.class

#=>Object

2 个答案:

答案 0 :(得分:4)

它实现了大多数Hash方法,但显然有一些缺失:

[:default, :default=, :default_proc, :default_proc=, :merge!, :merge, :flatten, :compare_by_identity, :compare_by_identity?]

您绝不会考虑使用其中大部分内容,但mergeflatten可能会有用。

请记住,ENV并不完全是哈希,而是围绕环境变量以及检索和设置它们的相关方法的包装。

答案 1 :(得分:4)

CRuby消息来源告诉你hash.c

envtbl = rb_obj_alloc(rb_cObject);
rb_extend_object(envtbl, rb_mEnumerable);
...
/*
 * ENV is a Hash-like accessor for environment variables.
 *
 * See ENV (the class) for more details.
 */
rb_define_global_const("ENV", envtbl);

因此虽然它是一个普通的对象,envtbl可以像哈希一样对待,尽管某些方法如tadman所述缺失。