7

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

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

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

3 回答 3

9

解析器将其解释+'/'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/"
于 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 回答