12

ActiveSupport::SafeBufferからStringオブジェクトを取得したい。メソッドto_sは、同じタイプのActiveSupport::SafeBufferを返します。to_sym.to_sのみが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
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::SafeBufferコメントするのに十分な評判はありませんが、に変換する必要がある場合があることを補足する必要がありStringます。

オブジェクトに適用gsubするときにこの問題が発生しました。ActiveSupport::SafeBuffer

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

$1常にnilになります。Stringsを最初に変換する必要があります

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

これは正しい答えを返します。ここでもs.to_s役に立ちません。

于 2015-05-24T06:16:14.477 に答える