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

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

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

共收到 8 条回复
17671

error log?

A908ae

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

我试了下,正常情况下当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吗?估计只是我们的使用姿势不对吧,把+两边都加上空格或者都不加就可以正常解析

681
def b
 1
end

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

1

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

24996

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

96

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

9800

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

681

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

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