Rails 3中的字符串连接

我想知道为什么会这样:如果在加号和下一个字符串之间有空格,Ruby会连接两个字符串。 但如果没有空间,它是否适用于一些一元运算符?

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

解析器将+'/'to_s方法调用的第一个参数。 它将这两个陈述视为等同:

 > 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 `
': 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 。 因为to_s在调用时不带任何参数。

正确的版本是:

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