12

我想从 ActiveSupport::SafeBuffer 中获取字符串对象。方法 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
4

3 回答 3

37

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

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

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

String#to_str工作原理完全一样String#to_s:它返回接收者,必要时将其转换为字符串。但与覆盖不同的ActiveSupport::SafeBuffer#to_s是,没有ActiveSupport::SafeBuffer#to_str调用原始方法。


请注意,它ActiveSupport::SafeBuffer是 的子类String

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

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

于 2013-03-27T08:58:11.490 回答
9

将其插入为字符串:

irb(main):001:0> "#{ActiveSupport::SafeBuffer.new("asdf")}".class
=> String
于 2013-03-27T08:43:17.537 回答
0

我没有足够的声誉发表评论,但我必须补充一点,有时需要转换ActiveSupport::SafeBufferString.

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

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

$1将永远为零。您必须将 s 转换为Stringfirst

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

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

于 2015-05-24T06:16:14.477 回答