2010-12-29 5 views
1

はRubyスクリプトです:それは名前discarded_rowsと(グローバル)変数を宣言します。ルビのグローバル変数はどのようにグローバルになっていますか?ここ

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 

そして、ここでは、私はそれがないと考えているものです。次に、渡された引数lineが "discarded * \ d"と一致するかどうかを調べる関数foobarを宣言します。存在する場合は、廃棄されたレコードの数を(グローバルと思われるもの)変数discarded_rowsに割り当てます。一致する場合は、一致するかどうかを確認するために「yepp ....」と表示されます( )。

関数が呼び出され、1つの文字列が一致する必要があります。

discarded_rowsが2に等しくない場合は、それに応じた値が出力されます。

そしてここで、スクリプトの出力です:だから

yepp, I have found: 2 
discarded_rows: -1 

は、明らかに、マッチが働いていた、と明らかに、discarded_rowsは真にグローバルではありません。これは正しいのですか、何か見落としていますか?

答えて

8

discarded_rowsはグローバル変数ではありません。 $discarded_rowsはグローバル変数です。

+0

はい、あなたは正しいと思います...そして、私は明らかにそれを覆しました。 –

3

ザバは絶対に正しいです。しかし、少し具体的には、discarded_rowsはローカル変数です。トップレベルのコードは、あたかもファイル全体がメソッドとして実行されているかのように扱われます。新しいメソッドを定義すると、実際にあなたがdef endブロックの本体が囲んを超える閉じない新しいレキシカルスコープを導入し

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 

ような何かを書くことができる点まで、ほとんどの言語に比べて、実行時にずっとそう起こりますレキシカルスコープ(周囲のコードのローカルはメソッド本体では使用できません)。

関連する問題