Ruby in pry: переопределение метода Range для строковых методов - PullRequest
0 голосов
/ 31 октября 2018

Я не могу заставить pry показать экземпляры моего класса, производные от Range, так как я переопределил to_s / inspect:

[1] pry(main)> class RangeInherited < Range
[1] pry(main)*   def initialize(first, last, added=nil)
[1] pry(main)*     super(first, last)
[1] pry(main)*     @added = added
[1] pry(main)*   end  
[1] pry(main)*   def to_s
[1] pry(main)*     "#<".concat(self.class.name, " ", super, " ", @added || "-", ">")
[1] pry(main)*   end  
[1] pry(main)*   alias inspect to_s
[1] pry(main)* end  
=> nil
[2] pry(main)> r = RangeInherited.new(1, 10, "x")
=> 1..10

Несмотря на то, что прямые вызовы to_s / inspect дают желаемый результат:

[3] pry(main)> r.to_s
=> "#<RangeInherited 1..10 x>"
[4] pry(main)> r.inspect
=> "#<RangeInherited 1..10 x>"
[5] pry(main)> 

Почему?


С помощью ответа Марцина Колодзея я пришел к следующему решению:

[1] pry(main)> class RangeInherited < Range
[1] pry(main)*   def initialize(first, last, added=nil)    
[1] pry(main)*     super(first, last)        
[1] pry(main)*     @added = added        
[1] pry(main)*   end      
[1] pry(main)*   def to_s    
[1] pry(main)*     "#<".concat(self.class.name, " ", super, " ", @added || "-", ">")        
[1] pry(main)*   end      
[1] pry(main)*   alias inspect to_s    
[1] pry(main)*   def pretty_print(pp)    
[1] pry(main)*     pp.text(to_s)        
[1] pry(main)*   end       
[1] pry(main)* end  
=> :pretty_print
[2] pry(main)> 
[3] pry(main)> r = RangeInherited.new(1, 10, "x")
=> #<RangeInherited 1..10 x>

1 Ответ

0 голосов
/ 31 октября 2018

Без какой-либо настройки , pry использует для вывода pp (симпатичная печать), а не inspect.

Чтобы перезаписать его, вы должны переопределить pretty_print, вот так:

def pretty_print(pp)
  pp.text(
    "#<".concat(self.class.name, " ", to_s, " ", @added || "-", ">")
  )
end  

ваш pry выведет то, что вы хотели:

[3] pry(main)> r = RangeInherited.new(1, 10, "x")
=> #<RangeInherited 1..10 x>
...