新手问题 这样写居然会报错是为什么?

lilijreey · 2016年10月19日 · 最后由 sevk 回复于 2016年11月25日 · 1930 次阅读
@content = @node.contents.new(:version => @node.version+1) ## 不会
@content = @node.contents.new(:version => @node.version +1) ## +1 前有一个空格就会报错

ruby 2.2.3 有哪位同学能说明一下原因,感谢

好像题主发现了一个不怎么常见的错误

我试了下,正常情况下当 hash 的 key 是 object.method+1 这种形式,分词的时候可以正常解析

pry(main)> Ripper.lex("{ foo: bar.length+1 }")                                                                                                                                                                  
=> [[[1, 0], :on_lbrace, "{"],
 [[1, 1], :on_sp, " "],
 [[1, 2], :on_label, "foo:"],
 [[1, 6], :on_sp, " "],
 [[1, 7], :on_ident, "bar"],
 [[1, 10], :on_period, "."],
 [[1, 11], :on_ident, "length"],
 [[1, 17], :on_op, "+"],
 [[1, 18], :on_int, "1"],
 [[1, 19], :on_sp, " "],
 [[1, 20], :on_rbrace, "}"]]

前面有一个空格时,并不能正常解析,+这个方法并没有被抓到

pry(main)> Ripper.lex("{ foo: bar.length +1 }")                                                                                                                                                                 
=> [[[1, 0], :on_lbrace, "{"],
 [[1, 1], :on_sp, " "],
 [[1, 2], :on_label, "foo:"],
 [[1, 6], :on_sp, " "],
 [[1, 7], :on_ident, "bar"],
 [[1, 10], :on_period, "."],
 [[1, 11], :on_ident, "length"],
 [[1, 17], :on_sp, " "],
 [[1, 18], :on_int, "+1"],
 [[1, 20], :on_sp, " "],
 [[1, 21], :on_rbrace, "}"]]

这算是个 issue 吗?估计只是我们的使用姿势不对吧,把 + 两边都加上空格或者都不加就可以正常解析

def b
 1
end

b +1 #报错
b+1 #不报错

#3 楼 @sevk b +1,+1 被解析为 b 方法的参数。

#4 楼 @Rei 对。这样解释就通了。不是函数也能被做为函数解释

貌似前面加了空格,后面也要加空格才行。要么 b+1,要么 b + 1,以前也碰到过,rubymine 直接有红色提示

强迫症要么不加,要么都加。。。

#4 楼 @Rei 应该加个判断,看看 b 是方法还是变量。如果 b 是方法,就出个 warn, 就说: "参数不能以 + 号开头。"

需要 登录 后方可回复, 如果你还没有账号请 注册新账号