我想从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
答案 0 :(得分:30)
实际上有一种方法:String#to_str
buf = ActiveSupport::SafeBuffer.new("asdf")
str = buf.to_str #=> "asdf"
str.class #=> String
String#to_str
与String#to_s
完全相同:它返回接收器,必要时将其转换为String。但与被覆盖的ActiveSupport::SafeBuffer#to_s
不同,没有ActiveSupport::SafeBuffer#to_str
,因此调用原始方法。
请注意,ActiveSupport::SafeBuffer
是String
的子类:
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
在这里也没用。