2017-04-12 1 views
1

Ce problème et d'autres similaires sont des problèmes auxquels je suis confronté en permanence, et j'aimerais comprendre le processus de réflexion derrière l'obtention de valeurs à partir d'objets, afin que je puisse résoudre des problèmes similaires.Obtenir des valeurs à partir d'objets Ruby en général?

Si vous avez un exemple similaire qui illustre la même chose, alors c'est juste un bon.

Question

Comment obtenir la valeur de Content-Length?

Et comment êtes-vous arrivé à la solution?

Si je fais pp res puis-je obtenir

#<HTTP::Message:0x0055ab1ef42738 
@http_body= 
    #<HTTP::Message::Body:0x0055ab1ef42698 
    @body= 
    "...", 
    @chunk_size=nil, 
    @positions=nil, 
    @size=0>, 
@http_header= 
    #<HTTP::Message::Headers:0x0055ab1ef42710 
    @body_charset=nil, 
    @body_date=nil, 
    @body_encoding=#<Encoding:ASCII-8BIT>, 
    @body_size=0, 
    @body_type=nil, 
    @chunked=false, 
    @dumped=false, 
    @header_item= 
    [["Connection", "close"], 
    ["Content-Type", "text/html"], 
    ["Content-Length", "291"]], 
    @http_version="1.1", 

Si je fais pp res.methods alors je vois http_header, donc je suis temped de penser que je peux me rapprocher de Content-Length par pp res.http_header.header_item, mais cela ne fonctionne pas.

La sortie de pp res.http_header.methods est

[:[], 
:[]=, 
:dump, 
:delete, 
:add, 
:all, 
:get, 
:set, 
:request_query, 
:content_type, 
:body_encoding, 
:http_version, 
:http_version=, 
:set_headers, 
:request_uri, 
:request_absolute_uri, 
:request_absolute_uri=, 
:set_date_header, 
:request_method, 
:body_size, 
:chunked, 
:status_code, 
:reason_phrase, 
:body_type, 
:body_charset, 
:body_date, 
:init_connect_request, 
:init_request, 
:init_response, 
:status_code=, 
:content_type=, 
:contenttype, 
:contenttype=, 
:set_body_encoding, 
:body_size=, 
:create_query_uri, 
:create_query_part, 
:chunked=, 
:reason_phrase=, 
:request_uri=, 
:request_query=, 
:body_type=, 
:body_charset=, 
:body_date=, 
:methods, 
:singleton_methods, 
:protected_methods, 
:private_methods, 
:public_methods, 
:to_yaml, 
:to_yaml_properties, 
:psych_to_yaml, 
:pretty_print, 
:pretty_print_cycle, 
:pretty_print_instance_variables, 
:pretty_print_inspect, 
:instance_of?, 
:public_send, 
:instance_variable_get, 
:instance_variable_set, 
:instance_variable_defined?, 
:remove_instance_variable, 
:kind_of?, 
:instance_variables, 
:tap, 
:public_method, 
:singleton_method, 
:is_a?, 
:extend, 
:define_singleton_method, 
:method, 
:awesome_print, 
:to_enum, 
:enum_for, 
:awesome_inspect, 
:ai, 
:pretty_inspect, 
:<=>, 
:===, 
:=~, 
:!~, 
:eql?, 
:respond_to?, 
:freeze, 
:inspect, 
:display, 
:object_id, 
:send, 
:to_s, 
:nil?, 
:hash, 
:class, 
:singleton_class, 
:clone, 
:dup, 
:itself, 
:taint, 
:tainted?, 
:untaint, 
:untrust, 
:trust, 
:untrusted?, 
:frozen?, 
:!, 
:==, 
:!=, 
:__send__, 
:equal?, 
:instance_eval, 
:instance_exec, 
:__id__] 

Répondre

4

Je ne sais pas quelle bibliothèque que vous utilisez, mais vous pouvez tout simplement aller avec sale obtenir des variables d'instance:

arr = res.instance_variable_get(:@http_header).instance_variable_get(:@header_item) 

Maintenant, recherchez simplement à travers le tableau:

arr.find { |a| a.first == 'Content-Length' }.last 
#=> "291" 
+0

En fouillant dans les entrailles d'un objet est généralement pas une bonne idée. Au lieu de cela, vous devez vérifier la documentation de l'objet et utiliser son interface publique autant que possible. Habituellement, les classes ne garantissent rien de leur représentation interne. Toute mise à jour peut changer cela de quelque manière que ce soit tandis que l'interface externe via les méthodes exposées reste souvent stable. –