我有一个使用Enumerable
和Forwardable
mixins的课程。问题是即使#each
已经实施(或委托),#member?
(也随Enumerable
提供)也无法正常工作。
require "forwardable"
class RestrictedHash
include Enumerable
extend Forwardable
def_delegators :@hash, :[], :[]=, :each
def initialize
@hash = {}
end
end
r_h = RestrictedHash.new
r_h[:a] = []
r_h.member?(:a) #=> false
r_h.member?(:a, []) #=> Wrong number of arguments (2 for 1)
r_h.member?([:a, []]) #=> true
h = {}
h[:a] = []
h.member?(:a) #=> true
h.member?([:a, []]) #=> false
为什么我在行为上有这种差异的任何想法?
答案 0 :(得分:1)
原因是each
上的Hash
方法产生了键和值对,因此对于您的示例@hash
:
irb(main):001:0> h = {}
=> {}
irb(main):002:0> h[:a] = []
=> []
irb(main):003:0> h.each { |i| puts i.inspect }
[:a, []]
这意味着当member?
中Enumerable
的实施使用each
检查指定的值是否为成员时,它将成功找到([:a, []]
但不会找到密钥{ {1}}本身。
:a
班级本身Hash
为implemented to call rb_hash_has_key。