2
x = "hello" " world".to_sym
puts x.class

これは機能し、2つの文字列をシンボルに連結して、次の出力を生成できます。

Symbol

しかし、helloとworldの文字列を区切るスペースの代わりに+を使用するように少し変更すると、エラーが発生します。

x = "hello" + " world".to_sym
puts x.class

これにより、次のエラーが発生します。これは、「hello」文字列に連結する前に、「world」.to_symコールバックを文字列に「キャスト」しようとしているためだと思います。

in `+': can't convert Symbol into String (TypeError)

何が最初の例を機能させるのか疑問に思いますか?ここでの操作の順序を知っている人はいますか?2つの文字列は実際には1つとして扱われ、それらの間のスペースは無視され、to_symメソッドが呼び出される前に連結されていると思われます。「hello」と「world」のコンテンツを結合しようとする前に、to_symが「world」文字列で呼び出されると思ったので、実際には2番目の例と同じように機能することを期待していました。

4

2 に答える 2

4

最初の例はシンタックス シュガーです。通常、これは次のように記述されます。

x = "Here is a string that " \
    "I want to split across " \
    "several lines..."

したがって、これは の前に最初に発生しto_symます。2 番目の例では、文字通り次のように呼び出しています。

x = "hello".+( "world".to_sym )

String#+引数としてシンボルを使用すると、何も役に立たないため、これは明らかに機能しません。

要するに、最初のものを実行しない"hello world".to_symでください。実行したいが、何らかの理由でそのように書くことができない場合は、括弧を使用してください。("hello" + " world").to_sym

于 2009-03-20T21:31:50.513 に答える
1

このように並べて配置された2 つ以上の文字列リテラルは、すぐに 1 つの文字列リテラルとして扱われます。Ruby インタープリターがコードをトークンに変換するとき、

"hello" " world"

単一のトークンstring "hello world"に変換されます

"hello" + " world"

string "hello"method +、およびの 3 つのトークンにstring " world"。後で実際にコードを実行するときに、文字列を連結します。

于 2009-03-20T21:35:39.537 に答える