Rails 3中的字符串连接

时间:2013-04-07 15:24:22

标签: ruby-on-rails ruby string concatenation

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

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

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

3 个答案:

答案 0 :(得分: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/"

答案 1 :(得分:6)

如果你想连接一个字符串,最安全的方法是写"#{params[:controller].to_s} /" ruby​​的字符串转义在许多情况下更安全更好

答案 2 :(得分:4)

仔细查看错误:

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

#=> in `<main>': undefined method `+@' for "/":String (NoMethodError)

这是因为unary operator +-等仅定义了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"