なぜそうなのか不思議です: Ruby は、プラスと次の文字列の間にスペースがあると、2 つの文字列を連結します。しかし、スペースがない場合、単項演算子が適用されますか?
params['controller'].to_s + '/'
# => "posts/"
params['controller'].to_s +'/'
# => NoMethodError: undefined method `+@' for "/":String
なぜそうなのか不思議です: Ruby は、プラスと次の文字列の間にスペースがあると、2 つの文字列を連結します。しかし、スペースがない場合、単項演算子が適用されますか?
params['controller'].to_s + '/'
# => "posts/"
params['controller'].to_s +'/'
# => NoMethodError: undefined method `+@' for "/":String
パーサーは、メソッド呼び出し+'/'
の最初のパラメーターとして解釈しています。to_s
これら 2 つのステートメントを同等のものとして扱っています。
> params['controller'].to_s +'/'
# NoMethodError: undefined method `+@' for "/":String
> params['controller'].to_s(+'/')
# NoMethodError: undefined method `+@' for "/":String
to_s
メソッド呼び出しの最後に括弧を明示的に含めると、問題は解決します。
> params['controller'].to_s() +'/'
=> "posts/"
文字列を連結したい場合、最も安全な方法は"#{params[:controller].to_s} /"
ruby の文字列エスケープを書くことです 多くの場合、より安全で優れています
エラーをよく見てください:
p "hi".to_s +'/'
p "hi".to_s -'2'
#=> in `<main>': undefined method `+@' for "/":String (NoMethodError)
これは、unary operator
+
, etc がクラス オブジェクト-
のみ定義されているためです。Numeric
以下のコードを見れば明らかです。
p "hi".to_s +2
#=>in `to_s': wrong number of arguments (1 for 0) (ArgumentError)
これで、上記のエラーは に正確に当てはまりますto_s
。Asto_s
は呼び出されたときに引数を取りません。
正しいバージョンは次のとおりです。
p "hi".to_s + '2' #=> "hi2"