body = article.body + "\n" + merge_with_article.body body = article.body +"\n" + merge_with_article.body
报错是 然后跑 rspec 的测试。就出现这个问题。。。 NoMethodError: undefined method `+@' for "\n":String 就在第二行
编辑器是 sublime
上面的一行就没报错,难道是一个空格的问题???
下午写 rspec,结果写着写着就变成全红了,我还以为我干了什么坏事呢。。。最后解决的办法是 bundle update。。。但不知道为什么。。。
我觉得这个帖子应该丢到瞎扯淡那!!!
首先,谢谢各位!
看了大家的回复,发现其实是有区别的,开始我以为这是个意外什么的。。。 简单说下,article 是一个 Article 的实例(instance)。然后,body 就是一个 method
22 楼是这样解释的 第二行
body = merge_a.body +"\n" + merge_with_a.body 等于 body = merge_a.body(+"\n") + merge_with_a.body http://stackoverflow.com/questions/15864068/string-concatenation-in-rails-3
19 楼有重现。
26 楼的解释是这样的 “原问题就是因为 + 这个运算符在不同类型上面的定义不同。“
29 楼说 Ruby 又两个可重定义的左连接修饰符 -@ 和 +@ (一会去查查这个东东。。。)
似乎这样的问题,只要多个空格就能解决。我一直以为空格 + 只是为了书写的工整(原来我其实一直有顺手加空格,最近写什么的时候发现写空格特别不舒服,就变成了有时候加有时候不加)。
你试的代码不对
irb(main):001:0> x + "\n"
NameError: undefined local variable or method `x' for main:Object
from (irb):1
from /usr/bin/irb:12:in `<main>'
irb(main):002:0> x +"\n"
NoMethodError: undefined method `+@' for "\n":String
from (irb):2
from /usr/bin/irb:12:in `<main>'
和 x 被定义成什么都关系
irb(main):001:0> def x
irb(main):002:1> 1
irb(main):003:1> end
=> nil
irb(main):004:0> x +"\n"
NoMethodError: undefined method `+@' for "\n":String
from (irb):4
from /usr/bin/irb:12:in `<main>'
特别是 + 前面是 method 的情况,无论这个 method 是否有定义都可以重现。
irb(main):001:0> class X
irb(main):002:1> def y
irb(main):003:2> 1
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> x = X.new
=> #<X:0x000000021b3670>
irb(main):007:0> x.y +"\n"
NoMethodError: undefined method `+@' for "\n":String
from (irb):7
from /usr/bin/irb:12:in `<main>'
第二行
body = merge_a.body +"\n" + merge_with_a.body
等于
body = merge_a.body(+"\n") + merge_with_a.body
#19 楼 @bhuztez 我式的,是 string 的情况下,因为楼主第二楼提出前后都是 string.
另外,我想说的意思是 ruby 对空白总体来说是不敏感的,但是正如你说的,+号是特例,因为他也用来做 single arity 的 operator.
来证明我的意图
irb(main):001:0> "abc" * "abv"
TypeError: no implicit conversion of String into Integer
from (irb):1:in `*'
from (irb):1
from /Users/yinghai.zhao/.rbenv/versions/2.0.0-p195/bin/irb:12:in `<main>'
irb(main):002:0> "abc" *"abv"
TypeError: no implicit conversion of String into Integer
from (irb):2:in `*'
from (irb):2
from /Users/yinghai.zhao/.rbenv/versions/2.0.0-p195/bin/irb:12:in `<main>'
另一个东西是,Ruby 是一个动态类型,但是是强类型的语言。 原问题就是因为 + 这个运算符在不同类型上面的定义不同。
用惯用法可以避免不必要的坑,比如字符串连接通常如下:
body = "#{article.body}\n#{merge_with_article.body}"
body = "%s\n%s" % [article.body, merge_with_article.body]
body = article.body +"\n" + merge_with_article.body
#=> 如下
body = article.body (+"\n" + merge_with_article.body)
#和这个是一样的
puts +1 + 2
「Ruby 又两个可重定义的左连接修饰符 -@ 和 +@ 」 数字类型的正负符号而已。 后面加字符串又没有空格隔开,自然报错,换成数字就没问题了(当然不满足需求了)。