shadowing outer local variableという警告文について(ローカル変数とブロック変数を同じ名前にした場合)

f:id:ryoutaku_jo:20190526194226p:plain

【結論】

・shadowing outer local variableは、ローカル変数とブロック変数を同じ名前にした場合などに、出力される警告文

ruby -wのオプションで警告文を出力させる様に指定しない限り、そのままプログラムが実行される

・警告文を無視して実行する際は、ブロック内ではブロック変数が優先して呼ばれる

【目次】

【本題】

調べるきっかけになったエラー

AtCoderのコンテストのある問題で、コードテストで実行した際には問題なかったはずなのに、コードを提出すると、下記の様なコンパイルエラーが発生しました。

f:id:ryoutaku_jo:20190526033413p:plain

今回は、このエラーについて調べた内容をまとめます。

なお、提出したコードは下記の通りです。

lines = []
while line = $stdin.gets do
  lines << line.chomp.split(" ")
end
 
l = 0
r = 100000
 
lines.delete_at(0)
 
lines.each do |line|
  l = line[0].to_i if line[0].to_i > l
  r = line[1].to_i if line[1].to_i < r
end
 
p r - l + 1

shadowing outer local variableについて

shadowing outer local variableとは、warningとある様に、Rubyの警告文になります。

そのままの意味で「外部のローカル変数を隠します」という警告です。

今回は、each文のlineというブロック変数が登場した箇所で警告が発せられていました。

確認して見ると、その前のwhile文の中で定義されているローカル変数lineと、each文のブロック変数lineが、名前が被っていました。

基本的にあってはならないことですが、ローカル変数とブロック変数を同じ名前だった場合、そのままでは処理が出来ない為、ブロック変数を優先して呼び出します。

その際、ローカル変数が邪魔になるので、一旦このブロック内では隠しますよという意味で、警告文が表示されていたわけです。

なお、単なる警告なので、プログラムの実行には影響を及ぼさない筈です。

ruby -wとオプションで警告文を出力する様に指定しない限りは表示もされません。

参考情報

備忘録的なblog: rubyのローカル変数とブロックローカル変数の注意点

Ruby の "shadowing outer local variable" という警告について - yu8mada

《今日の学習進捗(3年以内に10000時間に向けて)》

今日のAtCoder2問しか解けんかった・・・相変わらずRubyのピュアコードが書けん・・・チェリー本で復習しよう!

最近Firebaseが気になるので、そちらも調査して行こう。

学習開始からの期間 :169日
今日までの合計時間:1637h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1543h
目標との解離:94h
「10,000時間」まで、

残り・・・「8363時間!」