シャドーイングについて(ブロック引数とブロック外の変数が同名の場合)

f:id:ryoutaku_jo:20190608224220p:plain

【結論】

・ブロック引数と、ブロック外の変数の名前を一緒にした場合、ブロック内ではブロック引数が参照される

・この様に、変数やメソッドを参照できなくする機能はシャドーイングと呼ばれる

・動作はするが、可読性が落ちるので、原則同じ名前は避ける方が良い

【目次】

【本題】

ブロック引数とブロック外の変数が同名の場合の処理

ブロック引数と、そのブロック外部の変数を、同じ名前にした場合、処理はどの様になるのかをまとめました。

piko = ['pen', 'pineapple', 'apple', 'pen']
p = ['pineapple pen', 'apple pen']

piko.each do |p|
  puts "I have a #{p}"
end

上記の場合、ブロック引数とブロック外部の変数が、同じ「p」と命名されています。

この実行した場合、下記の様な出力結果となります。

I have a pen
I have a pineapple
I have a apple
I have a pen

つまり、ブロック外部の変数は一切参照されない結果となりました。

この様に、名前が重複した際に、片方の変数やメソッドを参照できなくする機能をシャドーイングと呼びます。

シャドーイングは原則利用しない

上記の通り、シャドーイングによりプログラムは正常に実行されますが、このコードだとどちらの変数が呼び出されるのか瞬時に理解するのが難しく可読性が落ちます。

なので、原則同じ名前を使う事は避けた方が賢明でしょう。

参考情報

Ruby: ブロック変数の「シャドウイング」はシャドウイングなのかが気になって調べた(社内勉強会)

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

今日はサービスローンチ直前のテストで休日出勤したけど、僕の作ったテストケースと段取りが悪過ぎて、現場大混乱。自分が任されてたタスクの振り分けやらなんやらもグダグダで、ビジネスサイドの人にめっちゃフォローして、貰ってなんとかテスト終わった😭次は上手くやりたいわ…

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

残り・・・「8229時間!」