Pourquoi est-ce? renvoie false pour la classe Hash?
Pourquoi is_a?
retourne false
pour un Hash
classe?
Exemple:
value = {"x" => 3, "y" => 2}
puts value.class
puts value.is_a?(Hash)
De sortie:
Hash
false
Im en utilisant Ruby 1.9.2
Mis à JOUR: la totalité du code source de ma classe:
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
source d'informationauteur Alexey Zakharov
Vous devez vous connecter pour publier un commentaire.
essayez de désactiver toutes les gemmes/extensions que vous avez chargé, et essayer de nettoyer avec ruby
Mise à JOUR:
essayer
value.is_a?(::Hash)
PS: essayez de lire à propos de Duck-Typing en Ruby. Peut-être que vous devriez appeler
value.respond_to?(:key)
au lieu devalue.is_a?(Hash)
Quand j'ai ajouté "::" avant de Hachage de la classe, il commence à travailler.
De sortie:
Il ne le fait pas.
Un Mongoid
Hash
n'est pas un pur-RubyHash
ni d'étendre. Vous devriez vérifier le type réel, probablement en utilisanttype
.Juste parce que quelque chose imprime
Hash
ne veut pas dire (a) qu'une partie de l'héritage de la chaîne que vous en pensez, et (b) qu'il est unHash
(témoin ActiveRecordArray
qui se trouve, à un degré).