这是一个红宝石脚本:
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
并不是真正的全球性。这是正确的还是我忽略了什么?
答案 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
块的主体引入了一个新的词法范围,该范围不会封闭在封闭的词法范围内(周围代码中的本地人不可用于该方法的主体)。