如何将ActiveSupport :: SafeBuffer转换为String?

时间:2013-03-27 08:40:59

标签: ruby

我想从ActiveSupport :: SafeBuffer中获取String对象。方法to_s返回相同类型的ActiveSupport :: SafeBuffer。只有to_sym.to_s返回String,但这更像是一个hack。这是我的控制台播放:

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

3 个答案:

答案 0 :(得分:30)

实际上有一种方法:String#to_str

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

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

String#to_strString#to_s完全相同:它返回接收器,必要时将其转换为String。但与被覆盖的ActiveSupport::SafeBuffer#to_s不同,没有ActiveSupport::SafeBuffer#to_str,因此调用原始方法。


请注意,ActiveSupport::SafeBufferString的子类:

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

所以通常根本不需要转换它。

答案 1 :(得分:9)

将其插入为字符串:

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

答案 2 :(得分:0)

我没有足够的声誉来评论,但我必须补充,有时需要将ActiveSupport::SafeBuffer转换为String

我在gsub对象上应用ActiveSupport::SafeBuffer时遇到了这个问题。

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

$1总是零。您必须先将s转换为String

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

这将返回正确答案。即使s.to_s在这里也没用。