2009-02-10 6 views
2

Je fais toujours cemeilleure façon d'imprimer non-cordes en Ruby

puts “The temperature is “ + String(temperature) + “.” 

dans mon code de débogage, et une autre option est d'utiliser l'interpolation

puts “The temperature is #{temperature}.” 

est-il un moyen moins lourd pour faire ça?

Éditer: Ceci est juste pour le débogage, si cela est important.

+0

Quelle est lourde à propos de l'interpolation? De quelle façon plus élégante pouvez-vous penser? – Chuck

Répondre

6

Aucun de ceux qui valent la peine pour les petits cas comme celui-là. Cependant, vous devriez préférer l'interpolation car elle est moins coûteuse que la concaténation.

2

La meilleure façon d'insérer des variables dynamiques dans les chaînes est

#interpolation 
"foo #{my_var} bar" 

Il appellera la méthode to_s sur tout objet les déclarations d'expression et d'insérer cette chaîne. Il est vraiment le même que

#concatenation 
"foo " + my_var.to_s + " bar" 

Mais, comme wfarr metioned, son plus rapide à faire l'interpolation. Plus facile à lire aussi.

+0

Il semble que vous l'ayez fait à l'envers. L'interpolation est le premier exemple. La concaténation est le deuxième exemple que vous avez donné. –

+0

Peut-être qu'il a été mal interprété de cette façon. J'ai clarifié avec des étiquettes :) –

+0

J'avais oublié la méthode .to_s. Pas une mauvaise option ... dépend de vos habitudes de frappe. Je n'utilise pas ce truc en code réel, mais juste pour comprendre ce qui se passe. –

0

Il y a toujours la possibilité d'utiliser la mise en forme printf de style:

"The temperature is %s" % temperature 

Cela permettrait la mise en forme plus fine des nombres, etc. ainsi. Mais honnêtement, combien moins "encombrant" que l'utilisation #{} interpolation pouvez-vous espérer obtenir?

+0

Pour être honnête, je tape sur un clavier espagnol mais je passe au format anglais la moitié du temps, donc trouver la clé numérique et les parenthèses n'est pas aussi facile que "thinger" + chose comme en Java. Mais oui, la syntaxe d'interpolation est réalisable. –

0

Une autre façon est de faire quelque chose de stupide comme ceci:

"The temperature is %s." % temperature.to_s

Personnellement, j'utiliser l'interpolation

1

Une approche légèrement différente est d'utiliser les assertions dans les tests automatisés.

Par exemple en utilisant Test :: Unit: -

assert_equal 25, temperature 

Je trouve que l'utilisation des tests automatisés réduisent considérablement la quantité de code de débogage je dois écrire.

+0

Très intéressant, je vais vérifier dans cette possibilité. Des réponses comme celle-ci font que mes questions stupides en valent la peine. –

+0

Alors, comment puis-je obtenir ce code à partir d'un programme Ruby? TestCase.assert_not_nil (blah) Je sais que j'ai besoin de quelque chose ou de quelque chose. –

+0

require 'test/unit' classe MyTest

1

Utilisez Kernel#p

p temperature #=> 10.25 

Quand je suis débogage, j'étiquette souvent ces déclarations juste en copiant la ligne, et en utilisant un double point, ce qui rend la variable dans un symbole.

p :attributes #=> :attributes 
p attributes #=> { :mood => "happy", 5 => [] } 

Ou

p [:location, location] #=> [ :location, "@ work" ] 

Notez que le noyau # p appelle #inspect sur ses arguments, au lieu de #to_s, mais cela fournit normalement plus utile informations de débogage de toute façon.

+0

Wow. Jolies choses. Je vérifierai. Tout ce qui peut sauver la saisie dans mes déclarations-deleted-deleted aide. –

1

Je recommande fortement d'utiliser irbtools gem qui inclut awesome_print ou awesome_print. Personnellement, je trouve cela plus rapide et moins encombrant à utiliser en dev, puis en utilisant des chaînes interpolées, c'est parfois la seule façon d'y aller.

Vous pouvez le faire sur n'importe quel objet et vous obtiendrez une image bien formatée comme un tableau, une chaîne ou un hachage ou tout autre objet complexe que vous pourriez avoir - comme un tableau 3-dimentional imprimé comme une arborescence. Pour qu'il soit disponible dans vos rails, il suffit de l'inclure dans le groupe de développement Gemfile, ou de l'ajouter à .irbrc - pour toujours l'avoir dans votre console IRB. Ensuite, il suffit de faire

require "awesome_print" 
ap MyGreatObject 

est ici un exemple de sortie d'un de mes projets

ap Address 
class Address < ActiveRecord::Base { 
        :id => :integer, 
     :address_line_1 => :string, 
     :address_line_2 => :string, 
     :address_line_3 => :string, 
       :city => :string, 
       :state => :string, 
       :zip => :string, 
      :country => :string, 
       :attn => :string, 
     :category_id => :integer, 
     :addressable_id => :integer, 
    :addressable_type => :string, 
      :created_at => :datetime, 
      :updated_at => :datetime 
} 


ap Address.first 
    Address Load (1.0ms) SELECT `addresses`.* FROM `addresses` LIMIT 1 
#<Address:0x7bc5a00> { 
        :id => 1, 
     :address_line_1 => "1 Sample Drive", 
     :address_line_2 => nil, 
     :address_line_3 => nil, 
       :city => "Chicago", 
       :state => "IL", 
       :zip => "60625", 
      :country => "USA", 
       :attn => nil, 
     :category_id => 1, 
     :addressable_id => 1, 
    :addressable_type => "Warehouse", 
      :created_at => Tue, 10 Jan 2012 14:42:20 CST -06:00, 
      :updated_at => Tue, 17 Jan 2012 15:03:20 CST -06:00 
} 
+0

merci pour l'idée –

+0

Pas de problème - c'est un super petit bijou. irbtools sont bons à. Consultez également pry - c'est une alternative cool à irb. – konung

+0

J'ai également oublié de mentionner - J'utilise Windows (ne peut pas utiliser mon Macbook au travail pour plusieurs raisons), la plupart du temps, Console2 aide à accélérer l'invite de commande. – konung