2009-03-20 9 views
2
x = "hello" " world".to_sym 
puts x.class 

これは動作し、私は出力を生成し、シンボルに2つの文字列を連結することができます:この連結での操作の順序は何ですか?

Symbol 

しかし、私は+の代わりにハロー、世界の文字列を分離するスペースを使用するように、わずかにそれを変更した場合、私はエラーを取得する:

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

これは、次のエラーを生成します - 私は「こんにちは」の文字列にそれを連結する前に、文字列にコールバック.to_sym「キャスト」「世界」にしようとしているためであると思います:

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

最初の例の作業は何ですか??誰が操作の順序がここにあるのか知っていますか?私は2つの文字列が実際には1つのものとして扱われ、それらの間のスペースは無視され、to_symメソッドが呼び出される前にそれらが連結されていると思われます。私は実際には、 "hello"と "world"の内容を結合しようとする前にto_symが "world"文字列で呼び出されると考えていたので、2番目の例と全く同じように動作することを期待していました。だから、これはto_sym前に、最初に発生

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

答えて

1

つ以上の文字列リテラルをのように、すぐ隣に置くとすぐに1つの文字列リテラルとして扱われます。 Rubyインタプリタは、トークンにコードを変換するとき、それは単一のトークンstring "hello world"

"hello" " world" 

を変換し、それが

"hello" + " world" 

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

4

最初の例では、通常、あなたがこのように書か参照、シンタックスシュガーです。第二の例では、文字通り呼んでいる。明らかにString#+は、引数としてのシンボルで有用な何もできないので、仕事に行くのではありません

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

。要するに

、あなたが"hello world".to_symをしたいとあなただけの何らかの理由でそのように書くことができないならば、ただカッコを使用し、最初のいずれかを実行していない:("hello" + " world").to_sym

関連する問題