在Ruby中打印非字符串的最简单方法

时间:2009-02-10 03:19:39

标签: ruby syntax

我一直在做这个

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

在我的调试代码中,另一个选项是使用插值

puts “The temperature is #{temperature}.”

有没有那么麻烦的方法呢?

编辑:这只是用于调试,如果重要的话。

7 个答案:

答案 0 :(得分:6)

对于像这样的小案例来说,没有什么是值得的。

尽管如此,你应该更喜欢插值,因为它比串联便宜。

答案 1 :(得分:2)

将动态变量插入字符串的最佳方法是

#interpolation
"foo #{my_var} bar"

它会在表达式返回的任何对象上调用to_s方法并插入该字符串。它与

完全相同
#concatenation
"foo " + my_var.to_s + " bar"

但是,正如wfarr所说,插值更快。也更容易阅读。

答案 2 :(得分:1)

稍微不同的方法是在自动化测试中使用断言。

例如使用Test :: Unit: -

assert_equal 25, temperature

我发现使用自动化测试可以大大减少我必须编写的调试代码量。

答案 3 :(得分:1)

使用Kernel#p

p temperature #=> 10.25

当我调试时,我经常只是通过复制行来标记这些语句,并使用插入冒号,使变量成为符号。

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

或者

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

请注意,内核#p在其参数上调用#inspect而不是#to_s,但这通常会提供更有用的调试信息。

答案 4 :(得分:1)

我强烈建议使用包含awesome_print或awesome_print的irbtools gem。 我个人认为在开发中使用它更快,更简单,然后使用插值字符串,有时这是唯一的方法。

你可以在任何对象上执行此操作,它将为您提供格式良好的输出,即数组,字符串或散列,甚至是您可能拥有的任何其他复杂对象 - 如打印为树结构的三维数组。为了让它在你的rails env中可用 - 只需将它包含在开发组的Gemfile中,或将其添加到.irbrc中 - 以便始终在你的irb控制台中使用它。然后就做

require "awesome_print"
ap  MyGreatObject

这是我的一个项目

的示例输出
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
}

答案 5 :(得分:0)

始终可以使用printf样式格式:

"The temperature is %s" % temperature

这样也可以更精细地格式化数字等。但老实说,与使用#{}插值相比,你会期望得到多少“麻烦”?

答案 6 :(得分:0)

另一种方法是做一些像这样的蠢事:

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

我个人使用插值