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

Cela fonctionne et me permet de concaténer les deux chaînes dans un symbole, produisant la sortie:Quel est l'ordre des opérations avec cette concaténation?

Symbol 

Mais si je change légèrement d'utiliser un + au lieu d'un espace séparant les chaînes de bonjour et monde , je reçois une erreur:

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

cela produit l'erreur suivante - Je pense que c'est parce qu'il essaie de « jeter » le « monde » .to_sym rappellerons à une chaîne avant de concaténer sur la chaîne « bonjour » :

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

Je me demande ce qui fait le premier exemple de travail? Est-ce que quelqu'un sait ce que l'ordre des opérations est ici? Je soupçonne que les deux chaînes sont traitées comme une seule, que l'espace entre elles est ignoré et qu'elles sont concaténées avant l'appel de la méthode to_sym. En fait, je m'attendais à ce qu'il ne fonctionne pas différemment du second exemple parce que je pensais que le to_sym serait appelé sur la chaîne "world" AVANT de tenter de joindre le contenu de "hello" et "world".

Répondre

1

Deux ou plusieurs cordes littéraux mis à côté les uns des autres comme cela sont immédiatement traités comme une seule chaîne littérale. Lorsque l'interpréteur Ruby convertit votre code à jetons, il convertit

"hello" " world" 

au jeton unique string "hello world" et il convertit

"hello" + " world" 

à trois jetons: string "hello", method + et string " world". Il serait ensuite concaténer les chaînes ensemble plus tard lors de l'exécution du code.

4

Le premier exemple est le sucre syntaxique, normalement vous voyez ce écrit comme:

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

Donc cela se produit d'abord, avant to_sym. Dans le deuxième exemple que vous appelez littéralement:

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

ce qui est évidemment ne va pas travailler depuis String#+ ne peut rien faire d'utile avec un symbole comme argument.

En bref, ne font pas le premier, si vous voulez faire "hello world".to_sym et vous ne pouvez pas simplement écrire comme ça pour une raison quelconque, puis il suffit d'utiliser les parenthèses: ("hello" + " world").to_sym

Questions connexes