Рубин: какой метод называется? - PullRequest
0 голосов
/ 22 января 2010

Предположим, у меня есть объект x из MyClass. Какой метод вызывается, когда я делаю puts x? Мне нужно переопределить это с моим собственным.

Я думал, что это .inspect, но как-то переопределено inspect не вызывается.

Например, у меня есть класс Sum:

class Sum
  initiazlie a, b
     @x = a + b
  end
end

И я хочу получить доступ к такому результату:

s = Sum.new(3,4)
puts s         #=>    7   How do I do this?
puts 10 + s    #=>   17   or even this...?

Ответы [ 2 ]

4 голосов
/ 22 января 2010

Звонит: to_s

class Sum
  def to_s
    "foobar"
  end
end

puts Sum.new #=> 'foobar'

Или, если хотите, вы можете просто вызвать inspect из to_s, чтобы у вас было согласованное строковое представление вашего объекта.

class Sum
  def to_s
    inspect
  end
end
3 голосов
/ 23 января 2010

Во-первых, ваш класс Sum недействителен. Определение должно быть.

class Sum
  def initialize(a, b)
     @x = a + b
  end
end

По умолчанию метод, вызываемый для получения удобочитаемого представления, является inspect. Попробуйте это в irb

$ s = Sum.new(3, 4)
# => #<Sum:0x10041e7a8 @x=7>
$ s.inspect
# => "#<Sum:0x10041e7a8 @x=7>"

Но в вашем случае вы используете метод puts, который вызывает преобразование строки. По этой причине объект Sum сначала преобразуется в строку с использованием метода to_s.

$ s = Sum.new(3, 4)
# => #<Sum:0x10041e7a8 @x=7>
$ puts s
# => #<Sum:0x10041e7a8>
$ puts s.to_s
# => #<Sum:0x10041e7a8>

Также обратите внимание, что ваш последний пример попадает в третий случай. Поскольку вы суммируете Fixnum + другой объект, ожидается, что результатом будет Fixnum, а вызываемый метод будет to_s, но определенный в классе Fixnum.

Чтобы использовать один элемент в своем классе Sum, вам необходимо переключить элементы в сумме и определить + в вашем объекте.

class Sum
  def initialize(a, b)
     @x = a + b
  end
  def +(other)
     @x + other
  end
  def to_s
    @x.to_s
  end
end

s = Sum.new(3, 4)
s + 10
puts s
# => 17
...