我理解以下警告的含义:
- :1:警告:在void上下文中无用的变量
但我不明白为什么Ruby 1.8.7中的ERB生成在void上下文中使用_erbout
变量的代码:
$ rvm use ruby 1.8.7
Using /Users/radeksimko/.rvm/gems/ruby-1.8.7-head
$ touch test.erb
$ erb -x test.erb
_erbout = ''; _erbout
$ erb -x test.erb | ruby -w
-:1: warning: useless use of a variable in void context
这不是ERB / Ruby 2.0.0+中的问题,但ERB从模板生成代码的方式不同:
$ rvm use 2.0.0
Using /Users/radeksimko/.rvm/gems/ruby-2.0.0-p598
$ erb -x test.erb
#coding:ASCII-8BIT
_erbout = ''; _erbout.force_encoding(__ENCODING__)
$ erb -x test.erb | ruby -w
$
要清楚,这与使用_
(下划线)处理Ruby版本之间的变量名称无关:
$ rvm use 2.0.0
Using /Users/radeksimko/.rvm/gems/ruby-2.0.0-p598
$ echo "erbout = ''; erbout" | ruby -w
-:1: warning: possibly useless use of a variable in void context
$ rvm use 1.8.7
Using /Users/radeksimko/.rvm/gems/ruby-1.8.7-head
$ echo "erbout = ''; erbout" | ruby -w
-:1: warning: useless use of a variable in void context
这是一个应该报告给Ruby / ERB核心的错误还是我只是误解了什么?
答案 0 :(得分:4)
警告是由第二行引起的:
_erbout = '';
_erbout
什么都不做(_erbout
是该范围内的局部变量),并且它位于上下文中,其中不返回行的值(如方法的最后一行)。
在Ruby 2.0.0中,此行替换为
_erbout = '';
的 _erbout.force_encoding(__ENCODING__)
即可。
现在ruby不确定方法调用是否有任何副作用,因此不会引发警告。
您可以使用以下代码重现此内容:
useless.rb
def test_me
unused = 1
unused
3
end
p test_me
$ ruby -w useless.rb
useless.rb:3: warning: possibly useless use of a variable in void context
3
所有这一切都发生了,因为erb -x
的输出不应该单独运行。运行ruby脚本时,最后一行 not 用作返回值,与方法不同。
如果您将代码嵌入程序中并实际使用_erbout
,则不会显示警告。