簡體   English   中英

紅寶石中的全局變量有多全局?

[英]How global are global variables in 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並不是真正的全球性比賽。 這是正確的還是我忽略了什么?

discarded_rows不是全局變量。 $discarded_rows將是一個全局變量。

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塊的主體引入了一個新的詞法作用域,該詞法作用域沒有超出封閉的詞法作用域(方法主體無法使用周圍代碼中的局部語言)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM