为什么空的ERB文件会在Ruby 1.8.7中引发警告?

时间:2015-02-25 07:18:38

标签: ruby erb ruby-1.8.7

我理解以下警告的含义:

  

- :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核心的错误还是我只是误解了什么?

1 个答案:

答案 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,则不会显示警告。