1
votes

Empêcher ruby ​​/ rails d'imprimer les résultats des expressions d'affectation

Quand je fais quelque chose comme ça dans les rails:

irb(main):060:0> conf.echo = false

La console évaluera les utilisateurs et l'imprimera (peut-être avec inspect , ou to_s , je ne suis pas sûr à 100%). Il en résulte des centaines de lignes de sortie que je ne veux pas vraiment.

Je sais que je peux faire quelque chose comme ça pour empêcher la sortie sur une ligne spécifique:

irb(main):060:0> users = User.where(name: "Joe"); nil


2 commentaires

Python se comporte de cette façon car l'affectation est une instruction (c'est-à-dire qu'elle n'a pas de valeur). Dans l'affectation ruby ​​est une expression, avec tout ce que cela implique.


@SergioTulentsev ouais, je vois ce que tu dis. De plus, si une expression python renvoie Aucun , la console n'imprime rien. J'ai juste avec il y avait un moyen d'empêcher irb d'imprimer la sortie d'une expression si l'expression était une affectation


3 Réponses :


0
votes

Je suppose que cela est dû au fait que dans Ruby, l’affectation renvoie automatiquement la valeur attribuée, c'est-à-dire

a = 1
#=> 1

Si vous fouillez dans la documentation de conf.echo , vous verra qu'il est utilisé pour contrôler quoi que ce soit pour afficher la valeur de retour ou non.


0 commentaires

0
votes

Créez un fichier nommé .irbrc dans votre dossier ~ ou dans votre dossier actuel. À l'intérieur, ajoutez:

IRB.conf[:ECHO] = false

Cela devrait désactiver l'écho.

Si vous placez IRB.conf , vous verrez d'autres paramètres que vous pouvez ajuster comme bien.

Plus d'informations se trouvent dans le documentation irb


2 commentaires

Ce n'est pas tout à fait ce qui est demandé. Ils veulent uniquement supprimer la sortie des affectations.


@SergioTulentsev c'est une bonne distinction, je l'ai passé sous silence pendant que je lisais. Je ne pense pas qu'il existe un paramètre pour ce comportement dans IRB, mais cela pourrait être suffisant pour le moment. J'ajoute simplement un ; après une instruction (en pry) quand je veux supprimer la sortie



1
votes

Edit:

Une version du MR référencée ci-dessous a été fusionnée avec irb, mais a été modifiée à quelques reprises depuis. Donc, pour obtenir le comportement souhaité, cela dépend de la version irb:

Si vous avez au moins 1.2.0 , mais moins de 1.2.6 : le comportement par défaut est de ne rien imprimer pour les instructions d'affectation. Vous devez définir IRB.conf [: ECHO_ON_ASSIGNMENT] = true si vous voulez l'ancien comportement (de toujours tout imprimer).

Si vous avez 1.2.6 , la valeur par défaut de ECHO_ON_ASSIGNMENT a été remplacée par true , et une nouvelle valeur de configuration: OMIT_ON_ASSIGNMENT a été ajoutée, ce qui tronquera la sortie longue pour instructions d'affectation, la valeur par défaut est true . Vous devez donc définir IRB.conf [: ECHO_ON_ASSIGNMENT] = false si vous ne voulez rien afficher pour les instructions d'affectation. Vous devez définir IRB.conf [: OMIT_ON_ASSIGNMENT] = false si vous voulez l'ancien comportement (de toujours tout imprimer).

Si vous avez 1.2.7 ou supérieur, OMIT_ON_ASSIGNMENT a été supprimé pour permettre à ECHO_ON_ASSIGNMENT d'accepter true , false ou : truncate , la valeur par défaut étant : truncate . Une valeur de true imprimera tout pour les instructions d'affectation, false n'imprimera rien et : truncate imprimera une version tronquée (comme le paramètre OMIT_ON_ASSIGNMENT à true dans 1.2.6).

Notez que les versions ci-dessus des versions de irb em > gem, pas les versions ruby ​​(même si irb est inclus dans la bibliothèque standard de ruby). Vous pouvez vérifier quelle version de irb vous avez en regardant IRB :: VERSION . Les très anciennes versions de irb ne définissent pas cette constante, donc si elle est manquante, vous avez certainement une version inférieure à 1.2.0 .

Original réponse:

Jusqu'à cette demande d'extraction (ou une demande similaire ) est fusionné, vous pouvez mettre ce qui suit dans votre fichier ~ / .irbrc :

require 'ripper'
module IRB
  class Irb
    ASSIGNMENT_NODE_TYPES = [:assign, :opassign, :massign]
    def assignment_expression?(line)
      ASSIGNMENT_NODE_TYPES.include?(Ripper.sexp(line)&.dig(1,-1,0))
    end

    def output_value # :nodoc:
      return if assignment_expression?(@context.last_line)
      printf @context.return_format, @context.inspect_last_value
    end
  end

  class Context
    attr_accessor :last_line
    def evaluate(line, line_no, exception: nil) # :nodoc:
      @line_no = line_no
      @last_line = line
      if exception
        line = "begin ::Kernel.raise _; rescue _.class; #{line}; end"
        @workspace.local_variable_set(:_, exception)
      end
      set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
    end
  end
end

Notez que depuis ce monkey-patches IRB :: Irb et IRB :: Context , il n'y a aucune garantie qu'il sera compatible avec les versions futures.


0 commentaires