web-dev-qa-db-ja.com

Rubyオブジェクトはポインターとして出力されます

単一の引数を取るコンストラクターを持つクラスを作成しようとしています。オブジェクトの新しいインスタンスを作成すると、ポインターが返されます。

class Adder
    def initialize(my_num)
        @my_num = my_num
    end
end
y = Adder.new(12)
puts y

私は何を間違えていますか?ありがとう

40
user1043856

newメソッドを使用すると、新しく作成されたオブジェクトの「参照」を取得します。 putsカーネルメソッドは、このオブジェクトに関する内部Ruby情報を返します。オブジェクトの状態に関する情報を取得する場合は、getterメソッドを使用できます。

class Adder
  def initialize(my_num)
    @my_num = my_num
  end
  def my_num
    @my_num
  end
end
y = Adder.new(12)
puts y.my_num  # => 12

または、舞台裏でいくつかのsetterおよびgetterメソッドを定義する 'attr_reader'メソッドを使用できます。

class Adder
  attr_accessor :my_num

  def initialize(my_num)
    @my_num = my_num
  end      
end
y = Adder.new(12)
puts y.my_num  # => 12
70
WarHog

これは、オブジェクトisポインターだからです。 Rubyでは、すべてのオブジェクトはヒープに割り当てられ、変数は単にそれらへの参照です。

するとき

puts y

実際には、オブジェクトのデフォルトのto_sメソッドを呼び出しています。これは、クラス名、メモリの場所、およびオブジェクトのインスタンス変数に関する情報を出力するだけです。

4
robbrit

Rubyにはポインターがありません。あなたの例では、yは、@my_num(それ自体はAdderオブジェクト)の値を持つ12というインスタンス変数を持つFixnumのインスタンスです。

putsメソッドは、渡す引数のto_sメソッドを呼び出します。それが出力です。おそらく、出力はポインタを参照していると思うかもしれませんが、それはオブジェクトの単なるテキスト表現です。クラスのto_sインスタンスメソッドをオーバーライドすることで変更できます。

4
coreyward