2016-11-28 4 views
2

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かその程度を見たいと思っています。

+0

"rubyは覚えているほどスマートです" -rubyは何も覚えていません。パーサーはシングルクォーテーション文字列でエスケープします。 – mudasobwa

+0

*ルビが元の文字列への参照/ポインタを保持しているかどうかを知りたいのですが、文字列が追加されたときには単に新しい文字列を作成しているように見えないので、単に連鎖されます。* - 'puts some_string .object_id'と見てください。 – 7stud

+1

問題の2番目の質問に対する答えは明白です:Cのポインタはおそらく関与できません.CベースではないRubyの実装が存在します(OpalはECMAScriptとRuby、Ruby.NETとIronRubyで書かれていますJavaで書かれたC#、JRuby、XRuby、NQPとPASMで書かれたCardinalで書かれています。 –

答えて

-1

私が気付いた別の興味深いことは、方法/機能から 文字列リテラルを返す方法がないことです。誰もがこれに私を指すことができる場合 私。

def do_stuff 
    "hello" 
end 

puts do_stuff.class 
puts do_stuff 
p do_stuff 


--output:-- 
String 
hello 
"hello" 
+0

私は確かに、そのような質問をする人はメソッドから文字列を返す方法を知っています;)。これによってOPが意味するかもしれないことは、メソッドから単一引用符付きの文字列を返すことができないということです。 –

3

は違い、通訳ワイズはありません。単一引用符と二重引用符の文字列は、パーサーレベルにのみ存在します。パーサは単一引用符に遭遇した場合、それは文字通りの文字を解析します

str = 'foo\nbar' #=> "foo\\nbar" 
str.chars  #=> ["f", "o", "o", "\\", "n", "b", "a", "r"] 
str.codepoints #=> [102, 111, 111, 92, 110, 98, 97, 114] 

パーサは二重引用符に遭遇した場合、それは、それぞれの文字にいくつかのエスケープシーケンスを変換(コードポイント10を持つASCII文字に例えばシーケンス\n、すなわち改行):

str = 'foo' "\n" 'bar' 
#=> "foo\nbar" 

パーサのTR:

str = "foo\nbar" #=> "foo\nbar" 
str.chars  #=> ["f", "o", "o", "\n", "b", "a", "r"] 
str.codepoints #=> [102, 111, 111, 10, 98, 97, 114] 

あなたも、単一引用符と二重引用符を混在させることができます単一の文字列リテラル"foo\nbar"としてそれを食べる。

いずれかの方法で、何「単一引用符で囲まれた文字列インスタンス」「二重引用符で囲まれた文字列インスタンス」、単なる文字列のインスタンスが存在しません。

Rubyは、文字列('...'"..."%q{...}<<HEREDOC?...)を作成するためにあなたにいくつかのリテラルを提供します。結果として得られるオブジェクトはすべて似ています。


は、内部補間文字列の静的な文字列のNODE_STRNODE_DSTRありますが、あなたは、Rubyの中から、そのレベルにアクセスすることはできません。いったん文字列インスタンスを取得すると、単なる文字列に過ぎません。

+0

いつものようにとても面白いです。 'str = 'foo'" \ n "'bar''です。ワオ。許容できる構文が非常に異なるため、Rubyに構文エラーがあるのには驚いています。 –

+0

この素晴らしい知っている。パーサーは、2つを区別します。 –

+0

しかし、インタプリタは、どのようにして 'objC'の部分がシングルクォートで、パートがダブルクォートであるのかを追跡しています。上の例から、 'c = a + b'を思い出してください。だから私たちはNODE_STR + NODE_DSTRを持っています。結果の文字列はNODE_STRかNODE_DSTRか?返された文字列または連結された文字列がすべてNODE_DSTRであるという疑いがあります。誰でもこれを確認できますか? –

関連する問題