2013-03-27 9 views
10

Voglio ottenere oggetto String da ActiveSupport :: SafeBuffer. Il metodo to_s restituisce lo stesso tipo di ActiveSupport :: SafeBuffer. Solo to_sym.to_s restituisce String, ma questo è più di un trucco. Ecco la mia console di gioco:Come convertire ActiveSupport :: SafeBuffer in String?

irb(main):008:0> s = ActiveSupport::SafeBuffer.new("asdf") 
# => "asdf" 
irb(main):009:0> s.class 
# => ActiveSupport::SafeBuffer 
irb(main):010:0> s.to_s.class 
# => ActiveSupport::SafeBuffer 
irb(main):011:0> s.to_sym.to_s 
# => "asdf" 
irb(main):012:0> s.to_sym.to_s.class 
# => String 
+0

Cosa stai cercando di fare? 'SafeBuffer' _è_ una stringa già. – matt

risposta

7

interpolare come una stringa:

irb(main):001:0> "#{ActiveSupport::SafeBuffer.new("asdf")}".class 
=> String 
+0

Grazie! Funziona meglio nel mio caso, dove a volte ottengo zero: '" # {nil} "' restituisce una stringa vuota, mentre 'String.new (nil)' restituisce un errore – eagor

+2

'String.new (s ||" ") 'funzionerebbe anche. – Stefan

25

C'è in realtà un metodo per questo: String#to_str

buf = ActiveSupport::SafeBuffer.new("asdf") 

str = buf.to_str #=> "asdf" 
str.class  #=> String 

String#to_str funziona esattamente come String#to_s: restituisce il ricevente , convertendolo in stringa se necessario. Ma a differenza dello ActiveSupport::SafeBuffer#to_s sostituito non c'è lo ActiveSupport::SafeBuffer#to_str quindi viene chiamato il metodo originale.


Nota che ActiveSupport::SafeBuffer è una sottoclasse di String:

s = ActiveSupport::SafeBuffer.new("asdf") 
s.is_a? String 
# => true 

Quindi di solito c'è bisogno di convertire affatto.

+0

questo è assolutamente vero, non ci dovrebbe essere la necessità di creare buffer sicuri. – phoet

+1

Avevo bisogno di farlo quando qualcosa stava restituendo un SafeBuffer nei miei test, perché CGI.unescapeHTML si interrompe orribilmente (con 'can not dup dup NilClass') se si tratta di un SafeBuffer e non di una stringa semplice. –

+0

Grazie per l'aggiornamento! Non avevo mai visto String # to_str prima. (Stavo usando Stringe.new (safe_buffer), che funziona anche.) –

0

Non ho abbastanza reputazione per commentare, ma devo aggiungere che a volte è necessario convertire ActiveSupport::SafeBuffer in String.

Ho riscontrato questo problema quando si applica gsub su un oggetto ActiveSupport::SafeBuffer.

s = ActiveSupport::SafeBuffer.new("asdf") 
s.gsub(/a/) { puts $1.present? } 

$1 sarebbe sempre nullo. È necessario convertire s per String prima

s = ActiveSupport::SafeBuffer.new("asdf") 
s.to_str.gsub(/a/) { puts $1.present? } 

Questo restituirà risposta giusta. Anche s.to_s non è utile qui.