2013-04-07 21 views
7

Zastanawiam się, dlaczego tak jest: Ruby łączy dwa ciągi, jeśli istnieje odstęp między plusem i następnym ciągiem. Ale jeśli nie ma miejsca, czy działa jakiś jednokierunkowy operator?Łączenie ciągów w Railsach 3

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

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

możliwe duplikat [String Powiązanie Błąd] (http://stackoverflow.com/questions/5861693/string-concatenation-error) – valk

Odpowiedz

9

Parser interpretuje +'/' jako pierwszy parametr do wywołania to_s metoda . To traktowanie tych dwóch sprawozdań za równoważne:

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

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

Jeśli wyraźnie obejmować nawiasu na końcu metody to_s nazwać problem zniknie:

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

no ** undefined metoda '+ @ 'dla"/": String ** nie dla twoich wyjaśnień. –

6

Jeśli chcesz złączyć ciąg, najbezpieczniejszym sposobem jest napisać "#{params[:controller].to_s} /" Ruby ciąg Cytowanie jest bezpieczniejsze i lepsze w wielu przypadkach

+0

'safer' jest też haczyk! – Jerome

4

Przyjrzeć błąd:

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

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

Dzieje się tak, ponieważ unary operator+, - itd. Jest zdefiniowane tylko jako Numeric obiektów klasy. Będzie jasne, jeśli spojrzeć na poniższy kod:

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

Teraz powyższy błąd jest dokładnie tuż za to_s. Ponieważ to_s nie przyjmuje żadnego argumentu po wywołaniu.

Poprawna wersja to:

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