[英]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.