메소드에서의 지역 변수와 블록에서의 지역 변수...

31 views
Skip to first unread message

므느으르

unread,
May 31, 2017, 4:50:15 AM5/31/17
to 한국 루비 사용자 모임
<div class="colorscripter-code" style="color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto"><table class="colorscripter-code-table" style="margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;" cellspacing="0" cellpadding="0"><tr><td style="padding:6px; border-right:2px solid #e5e5e5"><div style="margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%"><div style="line-height:130%">1</div><div style="line-height:130%">2</div><div style="line-height:130%">3</div><div style="line-height:130%">4</div><div style="line-height:130%">5</div><div style="line-height:130%">6</div><div style="line-height:130%">7</div><div style="line-height:130%">8</div><div style="line-height:130%">9</div><div style="line-height:130%">10</div><div style="line-height:130%">11</div><div style="line-height:130%">12</div><div style="line-height:130%">13</div><div style="line-height:130%">14</div><div style="line-height:130%">15</div><div style="line-height:130%">16</div><div style="line-height:130%">17</div><div style="line-height:130%">18</div><div style="line-height:130%">19</div><div style="line-height:130%">20</div><div style="line-height:130%">21</div></div></td><td style="padding:6px 0"><div style="margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%"><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#999999">##&nbsp;1.&nbsp;메소드&nbsp;##</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">a&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;<span style="color:#ff3399">nil</span></div><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#ff3399">def</span>&nbsp;some_method</div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;&nbsp;a&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;<span style="color:#308ce5">3</span></div><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#ff3399">end</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">p&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#999999">#=&gt;&nbsp;nil</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;</div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;</div><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#999999">##&nbsp;2.&nbsp;블록&nbsp;(선언&nbsp;x)&nbsp;##</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">(<span style="color:#308ce5">1.</span>.<span style="color:#308ce5">10</span>).each&nbsp;<span style="color:#ff3399">do</span>&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">|</span>i<span style="color:#0086b3"></span><span style="color:#ff3399">|</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;&nbsp;last_odd&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;i&nbsp;<span style="color:#ff3399">if</span>&nbsp;i%<span style="color:#308ce5">2</span>&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">!</span><span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;<span style="color:#308ce5">0</span></div><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#ff3399">end</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">p&nbsp;last_odd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#999999">#=&gt;&nbsp;NameError(undefined&nbsp;local&nbsp;variable&nbsp;or&nbsp;~~~~)</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;</div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;</div><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#999999">##&nbsp;3.&nbsp;블록&nbsp;(선언)&nbsp;##</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">last_odd&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;<span style="color:#ff3399">nil</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">(<span style="color:#308ce5">1.</span>.<span style="color:#308ce5">10</span>).each&nbsp;<span style="color:#ff3399">do</span>&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">|</span>i<span style="color:#0086b3"></span><span style="color:#ff3399">|</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">&nbsp;&nbsp;last_odd&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;i&nbsp;<span style="color:#ff3399">if</span>&nbsp;i%<span style="color:#308ce5">2</span>&nbsp;<span style="color:#0086b3"></span><span style="color:#ff3399">!</span><span style="color:#0086b3"></span><span style="color:#ff3399">=</span>&nbsp;<span style="color:#308ce5">0</span></div><div style="padding:0 6px; white-space:pre; line-height:130%"><span style="color:#ff3399">end</span></div><div style="padding:0 6px; white-space:pre; line-height:130%">p&nbsp;last_odd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#999999">#=&gt;&nbsp;9</span></div></div><div style="text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic"><a href="http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5; text-decoration:none">Colored by Color Scripter</a></div></td><td style="vertical-align:bottom; padding:0 2px 4px 0"><a href="http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white"><span style="font-size:9px; word-break:normal; background-color:#e5e5e5; color:white; border-radius:10px; padding:1px">cs</span></a></td></tr></table></div>


루비를 처음 공부하고 있는데 책을 보다가 궁금한 점이 생겼습니다.
https://colorscripter.com/ 에서 신택스 하이라이터를 사용했는데 코드가 제대로 나오는지 모르겠네요.
위 코드에는 각 1, 2, 3번의 경우에 대해 p 메소드로 출력되는 결과를 주석으로 적었습니다.


1번의 경우
  => 메소드 안의 지역 변수는 외부의 변수를 변경하지 않는 것 같고

2번의 경우
  => 블록 밖에서 last_odd가 선언되지 않아 참조할 수 없기 때문인 것 같고

3번의 경우
  => 이 부분이 궁금합니다.  메소드의 지역 변수는 외부의 변수에 영향을 주지 않았는데
       3번을 보면 블록의 지역 변수는 외부 변수에 영향을 줄 수 있는 것처럼 보입니다.
       원래 메소드와 블록의 지역 변수는 차이가 있는지 궁금합니다.

므느으르

unread,
May 31, 2017, 4:51:09 AM5/31/17
to 한국 루비 사용자 모임
코드가 안보여서 코드만 다시 작성합니다...

## 1. 메소드 ##
a = nil
def some_method
a = 3
end
p a #=> nil
## 2. 블록 (선언 x) ##
(1..10).each do |i|
last_odd = i if i%2 != 0
end
p last_odd #=> NameError(undefined local variable or ~~~~)
## 3. 블록 (선언) ##
last_odd = nil
(1..10).each do |i|
last_odd = i if i%2 != 0
end
p last_odd #=> 9
 

Park Ji-In

unread,
May 31, 2017, 6:59:11 AM5/31/17
to rub...@googlegroups.com
네. 블록에서는 블록 밖의 변수를 참조합니다.

2017년 5월 31일 (수) 오후 5:51, 므느으르 <hanm...@gmail.com>님이 작성:
--

---
이 메일은 Google 그룹스 '한국 루비 사용자 모임' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 rubykr+un...@googlegroups.com에 이메일을 보내세요.
https://groups.google.com/group/rubykr에서 이 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.
Reply all
Reply to author
Forward
0 new messages