红宝石中全局变量的全局性如何?

时间:2010-12-29 15:59:16

标签: ruby

这是一个红宝石脚本:

discarded_rows=-1

def foobar(line)

    if line.match('records discarded: *(\d+)') then
       discarded_rows=$1;
       puts('yepp, I have found: ' + discarded_rows);
    end;

end


foobar('records successful:    99    ');
foobar('records discarded:      2    ');
foobar('records unknown:        8    ');

if discarded_rows != 2 then
   puts("discarded_rows: #{discarded_rows}");
end

以下是我认为它的作用:它声明了一个名为discarded_rows的(全局)变量。然后它声明一个函数foobar,它检查传递的参数line是否匹配“丢弃的记录* \ d”。如果是,它会将丢弃的记录数量分配给(我认为是全局的)变量discarded_rows。如果它匹配,它也打印“yepp ....”只是为了确保 这场比赛有效。

调用该函数,其中一个字符串应匹配。

如果discarded_rows不等于2,则打印相应值。

这是脚本的输出:

yepp, I have found: 2
discarded_rows: -1

所以,显然,这场比赛是有效的,显然,discarded_rows并不是真正的全球性。这是正确的还是我忽略了什么?

2 个答案:

答案 0 :(得分:8)

discarded_rows不是全局变量。 $discarded_rows将是一个全局变量。

答案 1 :(得分:3)

Zabba绝对正确。然而,为了详细说明,discarded_rows是一个局部变量。顶级代码大致被视为整个文件作为方法执行。定义一个新方法实际上在运行时比在大多数语言中发生得更多,以至于你可以编写像

这样的东西。
s = gets
if s =~ /(\d+)/
   i = $1.to_i
   if i < 5
     def less_than_five
       true
     end
   else
     def less_than_five
       false
     end
    end
 else
   def less_than_five
     raise "not a number"
   end
end

p less_than_five

def end块的主体引入了一个新的词法范围,该范围不会封闭在封闭的词法范围内(周围代码中的本地人不可用于该方法的主体)。