6

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 で「example」と入力するだけで、探している動作 ([1, 2, 3] など) が得られます。私が理解していないことは何ですか?

4

3 に答える 3

5

オーバーライドする必要がto_sあり、自動的に処理されます。文字列を返すことを忘れないでto_sください。これはチャームとして機能します。


スニペットの例..

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
于 2012-07-13T03:54:28.327 に答える
5
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] 
于 2012-07-13T05:43:33.353 に答える
1

to_aryおそらく、配列のようなクラスのメソッドを実装する方がよいでしょう。このメソッドはputs、すべての要素を取得するために呼び出されます。以下の私のプロジェクトの1つからのスニペットを投稿しました

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 
于 2014-06-01T01:21:23.170 に答える