【问题标题】:Displaying Objects: puts and p, to_s and inspect显示对象:puts 和 p、to_s 和检查
【发布时间】:2015-11-19 18:04:57
【问题描述】:

在 Rubymonk 网站教程中,我遇到了一个关于检查与 to_s 部分的交互式问题(2.3 显示对象:puts 和 p、to_s 和检查)。他们要求覆盖 to_s 方法 > 以便它返回一个字符串物品的名称和数量。'

这里是具体问题的链接:https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects

我不知道如何处理这部分。我确实跳过了本教程,所以我可能错过了如何解决可能已经展示了如何解决这个问题的类似问题。

我在字符串中使用了 puts 方法和表达式的插值:

class Item
   def initialize(item_name, qty)
     @item_name = item_name
     @qty = qty
   end

   def to_s
      puts '#{@item_name} and #{@qty}'
   end
 end

item = Item.new("a",1)

puts item
p item

【问题讨论】:

    标签: ruby methods overriding


    【解决方案1】:

    试试:

    def to_s
      p "#{@item_name} and #{@qty}"
    end
    

    带双引号和p

    【讨论】:

      【解决方案2】:

      你的代码有两个问题:

      1. 单引号字符串不插入,只有双引号字符串可以插入
      2. 您没有返回字符串,而是将字符串作为参数传递给puts 并返回puts 的结果,但是,如果您查看puts 的文档,您会看到它总是返回nil

      所以,你的代码应该是这样的

      class Item
        def initialize(item_name, qty)
          @item_name = item_name
          @qty = qty
        end
      
        def to_s
          "#{@item_name} and #{@qty}"
        end
      end
      
      item = Item.new('a', 1)
      
      puts item
      p item
      

      【讨论】:

      • 有效。感谢您提供详细的提示。 1)我从来不知道1和2引号之间有区别,所以谢谢你。 2)我刚刚复制了关于从实际问题本身返回字符串的部分,但我一定会记住你的提示。另外,您所说的文档部分是什么?提前感谢您,非常感谢。
      • documentation for Kernel#puts 表示puts(obj, …) → nil,即puts 接受一个或多个参数并返回nil。但是to_s 不应该返回nil,它应该返回一个String(这就是为什么它被称为“to string”,毕竟)!
      猜你喜欢
      • 1970-01-01
      • 2016-08-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多