2010-12-08 10 views
3

Je veux tronquer la sortie #inspect dans irb (une grande sortie doit être recadrée à MAX_LEN).Tronquer la sortie #inspect dans irb (ruby)

Actuellement, je substitue: inspect,: to_s méthodes pour tous les objets spécifiques.

Y a-t-il d'autres solutions?

  • changez la sortie stdout?
  • autre?

Répondre

1

Votre solution est bonne.

Cela n'implique aucune magie noire, ce qui pourrait rendre le code moins compréhensible et sujet aux erreurs.

1

Si vous êtes juste dans IRB - vous pouvez définir un monkeypatch dans irb lui-même et ou charger un fichier que monkeypatches inspecter via 'load'. De cette façon vous le gardez hors de votre base de code mais vous obtenez toujours la fonctionnalité dont vous avez besoin sans devoir passer en revue dans chaque classe que vous souhaitez inspecter ....

1

Si c'est parce que vous avez un hachage imbriqué ou quelque chose c'est difficile à déchiffrer, essayez awesome_print. Vous pouvez en faire la formatter de sortie par défaut en plaçant irb ce qui suit dans votre .irbrc:

require 'ap' 

module IRB 
    class Irb 
    def output_value 
     ap @context.last_value 
    end 
    end 
end 

Cela rend les objets avec beaucoup de données faciles à déchiffrer la CISR.

Même si vous n'utilisez pas awesome_print, vous pouvez tronquer la sortie en utilisant cette même technique afin de ne pas avoir à surcharger to_s dans votre code.

5

Pour une solution propre, gem install hirb. hirb pages Les valeurs renvoyées par irb sont trop longues.

Si vous voulez monkey-patch irb:

module IRB 
    class Irb 
    def output_value 
    @context.last_value.to_s.slice(0, MAX_LEN) 
    end 
    end 
end 

Je ne recommande pas cela parce que c'est un hack et casse les pierres précieuses de temps comme ap et hirb sont nécessaires. Au lieu de monoteryper IRB, je recommande d'essayer ripl, une alternative irb qui est destiné à prolonger. ci-dessus en tant que plugin RIPL serait:

require 'ripl' 
module Ripl::SlicedInspect 
    def format_result(result) 
    result_prompt + result.inspect.slice(MAX_LEN) 
    end 
end 
Ripl::Shell.send :include, Ripl::SlicedInspect 

Avec ce plugin, vous pourriez avoir besoin au besoin ou ajouter à votre ~/.riplrc si vous souhaitez toujours utiliser.

1

Pour rails 3.1.1+, placez le code ci-dessous dans les aides/irb_helper.rb

module IRB 
    class Irb 
    MAX_LEN = 10000 

    def output_value 
     if (@context.inspect_last_value.length > MAX_LEN) 
     printf @context.return_format, "#{@context.inspect_last_value[0..MAX_LEN]} <- Truncated" 
     else 
     printf @context.return_format, @context.inspect_last_value 
     end 
    end 
    end 
end 

Si vous souhaitez personnaliser votre sortie plus, vérifiez la source de RIR à https://github.com/Ruby/Ruby/blob/trunk/lib/irb.rb

0

Je parfois modifier les objets eux-mêmes (via un module appelé BoringInspect qui I include dans les classes concernées) afin que les messages d'exception sont également gérables.

+0

+1 BoringInspect vous semble particulièrement approprié;) – horseyguy

+0

@banister: Je n'avais pas réalisé que vous me connaissiez bien! Était-ce un +1 ou un -1? –

+0

J'ai lu votre demande d'arrachage en train de supprimer les gros mots de ruby-core ... vous n'êtes pas le genre de mec que j'inviterais à un dîner! * bâillement *;) – horseyguy

Questions connexes