7

なぜそうなのか不思議です: Ruby は、プラスと次の文字列の間にスペースがあると、2 つの文字列を連結します。しかし、スペースがない場合、単項演算子が適用されますか?

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

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

3 に答える 3

9

パーサーは、メソッド呼び出し+'/'の最初のパラメーターとして解釈しています。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/"
于 2013-04-07T15:30:10.067 に答える
6

文字列を連結したい場合、最も安全な方法は"#{params[:controller].to_s} /"ruby​​ の文字列エスケープを書くことです 多くの場合、より安全で優れています

于 2013-04-07T15:29:40.897 に答える
4

エラーをよく見てください:

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"
于 2013-04-07T15:34:41.620 に答える