Почему is_a? возвращает false для класса Hash?
Почему is_a?
возвращает false
для класса Hash
?
Пример:
value = {"x" => 3, "y" => 2}
puts value.class
puts value.is_a?(Hash)
Вывод:
Hash
false
Im с использованием 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
Ответы
Ответ 1
#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
попробуйте отключить любые загруженные gems/расширения, и попробуйте с чистым ruby
UPDATE:
попробуйте value.is_a?(::Hash)
PS: попробуйте прочитать Duck Typing в Ruby. Может быть, вы должны называть value.respond_to?(:key)
вместо value.is_a?(Hash)
Ответ 2
Когда я добавил "::" до класса Hash, он начинает работать.
puts value.class
puts value.is_a?(::Hash)
Вывод:
Hash
true
Ответ 3
Это не так.
[email protected]:~ $ rvm list
rvm rubies
ruby-1.8.7-p334 [ i386 ]
jruby-1.6.2 [ linux-i386-java ]
ruby-1.9.2-p0 [ i386 ]
ruby-1.9.2-p290 [ i386 ]
ruby-1.9.3-p0 [ i386 ]
=> ruby-1.9.2-p180 [ i386 ]
[email protected]:~ $ pry
pry(main)> value = {"x" => 3, "y" => 2}
=> {"x"=>3, "y"=>2}
pry(main)> value.is_a? Hash
=> true
Монгоид Hash
не является чистым-рубином Hash
, и он не расширяет его. Вы должны проверить фактический тип, возможно, используя type
.
Просто потому, что что-то распечатывает Hash
, не означает (a), что он является частью цепочки наследования, о которой вы думаете, и (b) что это a Hash
(свидетель ActiveRecord Array
, который лежит, в некоторой степени).