【问题标题】:String concatenation in Rails 3Rails 3中的字符串连接
【发布时间】:2013-03-29 15:32:35
【问题描述】:

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

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

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

【问题讨论】:

标签: ruby-on-rails ruby string concatenation


【解决方案1】:

解析器将+'/' 解释为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/"

【讨论】:

  • no undefined method `+@' for "/":String 不是为了你的解释。
【解决方案2】:

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

【讨论】:

  • safer 是踢球者!
【解决方案3】:

仔细查看错误:

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"

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 2013-04-25
    • 2019-04-13
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多