为什么是_a?为Hash类返回false?

Ale*_*rov 13 ruby database mongoid

为什么is_a?返回falseHash类?

例:

value = {"x" => 3, "y" => 2}

puts value.class
puts value.is_a?(Hash)
Run Code Online (Sandbox Code Playgroud)

输出:

Hash
false
Run Code Online (Sandbox Code Playgroud)

我使用Ruby 1.9.2

更新:我的课程的完整来源:

class LatLng
  include Mongoid::Fields::Serializable

  attr_reader :lat, :lng

  def serialize(value)
    return if value.nil?

    puts value.class
    puts value.is_a?(Hash)

    if value.is_a?(self.class)
      puts "is geopoint" + value.to_json
      {'lng' => value.lng.to_f, 'lat' => value.lat.to_f}
    elsif value.is_a?(Hash)
      hash = value.with_indifferent_access
      puts "is hash" + value.to_json
      {'lng' => hash['lng'].to_f, 'lat' => hash['lat'].to_f}
    end
  end

  def deserialize(value)
    return if value.nil?

    value.is_a?(self.class) ? value : LatLng.new(value['lat'], value['lng'])
  end

  def initialize(lat, lng)
    @lat, @lng = lat.to_f, lng.to_f
  end

  def [](arg)
    case arg
      when "lat"
        @lat
      when "lng"
        @lng
    end
  end

  def to_a
    [lng, lat]
  end

  def ==(other)
    other.is_a?(self.class) && other.lat == lat && other.lng == lng
  end
end
Run Code Online (Sandbox Code Playgroud)

zed*_*xff 19

#irb
ruby-1.9.3-p0 :001 > value = {"x" => 3, "y" => 2}
 => {"x"=>3, "y"=>2} 
ruby-1.9.3-p0 :002 > value.is_a?(Hash)
 => true
Run Code Online (Sandbox Code Playgroud)

尝试禁用已加载的任何宝石/扩展,并尝试使用干净的红宝石

更新:

尝试 value.is_a?(::Hash)

PS:尝试阅读Ruby中的Duck Typing.也许你应该打电话value.respond_to?(:key)而不是value.is_a?(Hash)

  • 试试`value.is_a?(:: Hash)` (4认同)

Ale*_*rov 5

当我在 Hash 类之前添加“::”时,它开始工作。

puts value.class
puts value.is_a?(::Hash)
Run Code Online (Sandbox Code Playgroud)

输出:

Hash
true
Run Code Online (Sandbox Code Playgroud)

  • 与其回答您自己的问题,不如接受 zed_oxff 上面的更新答案? (5认同)