Ruby:实现返回Enumerator的函数

时间:2016-10-11 01:56:03

标签: ruby hash ienumerator

对于个人Hash实现,我想创建一个mapmap!的banged版本,即更改当前对象的版本,就像存在的版本一样Array。当给出一个块时,下面的实现似乎正常工作:

class MyHash < Hash

  def map! &block
    self.map { |ek, ev| self[ek] = block[ev] }  if block_given?
    # how to return the Enumerator if block not given?
  end

end

在没有阻止的情况下进行调用时,hash.map会返回Enumerator,如下例所示:

h.map
=> #<Enumerator: {1=>2, 12=>21, 6=>3}:map>

当我没有给出一个块时,我应该添加什么来使它返回枚举器?

2 个答案:

答案 0 :(得分:2)

使用Object#to_enum

非常简单
class MyHash < Hash
  def map!
    if block_given?
      each { |k, v| self[k] = yield v }
    else
      to_enum :map!
    end
  end
end

答案 1 :(得分:-1)

我无法获得您的代码所做的事情,但您可以尝试返回self.each

def map! &block
    if block_given?
        self.map { |ek, ev| self[ek] = block[ev] }
    else
        self.each
    end
end