rubyインタプリタが文字列リテラル(一重引用符で囲まれた文字列)と二重引用符で囲まれた文字列の違いを知っている方法を知っていますか?rubyは一重引用符で囲まれた文字列と二重引用符で囲まれた文字列をどのように区別しますか? Cポインタは関係していますか?
私は文字列で遊んでいます。私は文字列を再生することが可能かどうかを判断しようとしています。
文字列内のエスケープシーケンスをそれぞれのASCIIコードに置き換えることで、ある程度これを実行できました。私は、この二重引用符で囲まれた文字列
解釈"a\e[0;36m X \n"
はXと
a X
につながるまし
\n = 10 -> \\ = 92, n = 110
は、シアンのフォントの色で表示しました。そして、エスケープシーケンスをバックスラッシュで始まる文字に変更しました。これは、渡された文字列がダブルストリングの場合にのみ機能します。私は一重引用符で囲まれた文字列を渡して二重引用符で囲むことで、補間を許可することができませんでした。そして、結局、私は文字列を実際に内容を変更していないので、そのように動作します。
これで、文字列がシングルクォートとダブルクォートのどちらであるかをルビーがどのように知っているかを理解することに興味がありました。私はIRBで遊んでいたときにこれをやったので、これを行うための仕組みがあると確信しています。
a = "One\nTwo\t Half\n"
=> "One\nTwo\t Half\n"
b = 'Three \n Four \f Five'
=> "Three \\n Four \\f Five"
puts a + b
One
Two Half
Three \n Four \f Five
=> nil
c = a + b
One
Two Half
Three \n Four \f Five
=> nil
だから、あなたが見ることができるようにルビーは、文字列の特定のチャンクが引用され、単一であり、他の二重引用符で囲まれたされていることを覚えておくのに十分なスマートです。私はルビが元の文字列への参照/ポインタを保持しているかどうかを知りたいと思っています。文字列が追加されたときには、新しい文字列を作成しているように見えないので、
私が気づいた別の興味深いことは、メソッド/関数から文字列リテラルを返す方法がないことです。誰かが私にこの点を指すことができる場合。
別の質問のためにこれを残しましょう。
アップデート:
私は今
ObjectSpace._id2ref(obj.object_id)
で遊んでいますので、上記の例から、私はこれを試してみました。
a.object_id
=> 70219586904340
puts ObjectSpace._id2ref 70219586904340
One
Two Half
=> nil
b.object_id
=> 70219590675520
puts ObjectSpace._id2ref 70219590675520
Three \n Four \f Five
=> nil
c = a + b
puts ObjectSpace._id2ref c.object_id
One
Two Half
Three \n Four \f Five
=> nil
私は現在オブジェクトを再生していますが、まだ見つかりません。私は内部を見て、objA + objBかその程度を見たいと思っています。
"rubyは覚えているほどスマートです" -rubyは何も覚えていません。パーサーはシングルクォーテーション文字列でエスケープします。 – mudasobwa
*ルビが元の文字列への参照/ポインタを保持しているかどうかを知りたいのですが、文字列が追加されたときには単に新しい文字列を作成しているように見えないので、単に連鎖されます。* - 'puts some_string .object_id'と見てください。 – 7stud
問題の2番目の質問に対する答えは明白です:Cのポインタはおそらく関与できません.CベースではないRubyの実装が存在します(OpalはECMAScriptとRuby、Ruby.NETとIronRubyで書かれていますJavaで書かれたC#、JRuby、XRuby、NQPとPASMで書かれたCardinalで書かれています。 –