2013-04-07 14 views
7

Mi chiedo perché sia ​​così: Ruby concatena due stringhe se c'è uno spazio tra il più e la stringa successiva. Ma se non c'è spazio, applica qualche operatore unario?Concatenazione di stringhe in Rails 3

params['controller'].to_s + '/' 
# => "posts/" 

params['controller'].to_s +'/' 
# => NoMethodError: undefined method `[email protected]' for "/":String 
+0

possibile duplicato del [String concatenazione Error] (http://stackoverflow.com/questions/5861693/string-concatenation-error) – valk

risposta

9

Il parser interpreta +'/' come primo parametro alla chiamata to_s metodo . Si sta trattando queste due affermazioni come equivalenti:

> params['controller'].to_s +'/' 
# NoMethodError: undefined method `[email protected]' for "/":String 

> params['controller'].to_s(+'/') 
# NoMethodError: undefined method `[email protected]' for "/":String 

Se si include esplicitamente la parentesi alla fine del metodo to_s chiamare il problema scompare:

> params['controller'].to_s() +'/' 
=> "posts/" 
+0

no ** metodo non definito '+ @ 'per"/": stringa ** non per le tue spiegazioni. –

6

Se si desidera concatenare una stringa, il modo più sicuro è quello di scrivere "#{params[:controller].to_s} /" fuga stringa di rubino è più sicuro e meglio in molti casi

+0

'safer' è il kicker! – Jerome

4

Osservare attentamente l'errore:

p "hi".to_s +'/' 
p "hi".to_s -'2' 

#=> in `<main>': undefined method `[email protected]' for "/":String (NoMethodError) 

Questo perché unary operator+, - ecc è definito solo Numeric oggetti di classe. Sarà chiaro se si guarda il codice qui sotto:

p "hi".to_s +2 
#=>in `to_s': wrong number of arguments (1 for 0) (ArgumentError) 

Ora l'errore di cui sopra è esattamente giusto per to_s. Come to_s non accetta alcun argomento quando viene chiamato.

versione corretta è:

p "hi".to_s + '2' #=> "hi2"