【问题标题】:Ruby: overriding the puts methodRuby:覆盖 puts 方法
【发布时间】:2012-07-13 03:51:08
【问题描述】:

我有一个打算在 IRB 中运行的小程序。它最终输出一些看起来像数组的东西,尽管从技术上讲不是数组。 (该类继承自数组。)问题是,当我做这个类的一个实例时,例如example = Awesome.new(1,2,3),我写“puts example”,IRB的默认行为是将example的每个元素放在自己的行上。

所以不是

[1,2,3]

(这是我想要的),IRB 弹出这个。

1
2
3 

有没有一种聪明的方法来覆盖这个特殊类的 puts 方法?我试过了,但没有用。

def puts
  self.to_a
end

知道我做错了什么吗?

更新:所以我尝试了这个,但没有成功。

def to_s
  return self
end

所以当我在 IRB 中并且我只输入“示例”时,我得到了我正在寻找的行为(即 [1, 2, 3]。所以我想我可以只返回自我,但我'显然,我还在搞砸什么。我不明白什么?

【问题讨论】:

  • 您是否有理由需要覆盖puts 而不仅仅是使用p
  • 你没有从 to_s 返回一个正确的字符串,为什么不直接生成你自己的字符串并返回呢?解决问题的方法也在我的帖子中;我们通常不喜欢作者在发布后更改所提出的问题,那么最好留下它并提出一个新问题。

标签: ruby irb


【解决方案1】:
def puts(o)
  if o.is_a? Array
    super(o.to_s)
  else
    super(o) 
  end  
end

puts [1,2,3] # => [1, 2, 3]

或者直接使用p:

p [1, 2, 3] # => [1, 2, 3] 

【讨论】:

    【解决方案2】:

    你应该覆盖to_s,它会被自动处理,只要记住从to_s返回一个字符串,它就会作为一个魅力。


    示例 sn-p..

    class Obj 
      def initialize(a,b)
        @val1 = a 
        @val2 = b 
      end 
    
      def to_s
        "val1: #@val1\n" +
        "val2: #@val2\n" 
      end 
    end
    
    puts Obj.new(123,321);
    

    val1: 123
    val2: 321
    

    【讨论】:

      【解决方案3】:

      您最好为您的类数组类实现to_ary 方法。这个方法会被puts调用来获取所有的元素。我在下面的一个项目中发布了一个 sn-p

      require 'forwardable'
      
      class Path 
        extend Forwardable
        def_delegators :@list, :<<, :count, :include?, :last, :each_with_index, :map
      
        def initialize(list = [])
          @list = list
        end
      
        def to_ary
          self.map.each_with_index{ |e, i| "#{e}, step: #{i}" }
        end
      end 
      

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多