需要具有系统类命名冲突的gem

时间:2015-06-09 22:06:55

标签: ruby require class-names

我在Rake中编写了一个使用几个第三方宝石的构建脚本。其中一个gem定义了一个名为Hash的类。

class Hash
  alias hkeys keys

  def keys
    hkeys.sort {|a,b| a.to_s <=> b.to_s }
  end

  def each
    keys.each { |k| yield k, self[k] }
  end
end

这打破了枚举,导致no block given (yield) (LocalJumpError)。我读到我可以使用::Hash来引用核心ruby类型,但是如何使用

之类的代码
bucket.objects.each do |obj|
  puts "#{obj.key} => #{obj.etag}"
end 

1 个答案:

答案 0 :(得分:1)

  

其中一个gem定义了一个名为Hash的类。

不,它没有。它修改了现有的Hash类。

  

我读到我可以使用::Hash来引用核心ruby类型

这完全是胡说八道。 ::Hash只是说常量查找应该从根(即Object)而不是当前范围开始。只有当两个常量命名为Hash并且您想消除歧义时,这才有用。但在你的情况下,只有一个常量名为Hash,而gem正在修改该常量引用的类。

除了不要使用这些蹩脚的宝石外,你根本无能为力。