-
18-09-2019 - |
문제
내가 사용하고 있다고 가정 해 봅시다 irb
, 및 유형 a = 5
. 정의를 어떻게 제거합니까? a
그래서 타이핑 a
반환 a NameError
?
일부 맥락 : 나중에 나는 이것을하고 싶습니다 :
context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a' # though this doesn't work.
해결책
거기 있습니다 remove_class_variable, remove_instance_variable 그리고 제거 _const 방법이지만 현재 로컬 변수에는 동등한 것이 없습니다.
다른 팁
변수가 존재하는 범위를 줄임으로써 변수를 고려하지 않도록 할 수 있습니다.
def scope
yield
end
scope do
b = 1234
end
b # undefined local variable or method `b' for main:Object
IRB 서브 쉘을 호출하여 항상 IRB의 로컬 변수 레지스트리를 '클리어'할 수 있습니다. 배쉬 쉘이 수출되지 않은 환경 변수와 관련하여 어떻게 작동하는지 생각해보십시오. 대화식 모드를 측정하기 때문에이 솔루션은이를 위해 작동해야합니다.
프로덕션 코드까지는 솔루션의 일부로 로컬 변수를 정의하지 않기를 원합니다. 키드 해시는 아마도 해당 유형의 시나리오에서 더 나을 것입니다.
내가 의미하는 바는 다음과 같습니다.
$ irb
irb(main):001:0> a = "a"
=> "a"
irb(main):002:0> defined? a
=> "local-variable"
irb(main):003:0> irb # step into subshell with its own locals
irb#1(main):001:0> defined? a
=> nil
irb#1(main):002:0> a
NameError: undefined local variable or method `a' for main:Object
from /Users/dean/.irbrc:108:in `method_missing'
from (irb#1):2
irb#1(main):003:0> exit
=> #<IRB::Irb: @context=#<IRB::Context:0x1011b48b8>, @signal_status=:IN_EVAL, @scanner=#<RubyLex:0x1011b3df0>>
irb(main):004:0> a # now we're back and a exists again
=> "a"
현재 글로벌 변수, 로컬 변수 및 클래스 변수를 제거 할 의미가 없습니다. 그래도 "remove_const"메소드를 사용하여 상수를 제거 할 수 있습니다.
질문의 정신으로, 다른 로컬 변수가 동일한 범위로 고정되어 있다고 가정하면 변수를 범위로 제한 할 수 있습니다. 이것은 특히 수업에서 무언가를 정의하고 로컬 변수가 클래스 선언에 머무르기를 원하지 않는 경우 특히 유용합니다.
내가 이것을 할 수있는 유일한 방법은 Integer#times
또는 Array#each
그렇게 :
1.times do |a|
a = 5
# code…
end
[5].each do |a|
# code…
end
아마도이 외에 블록으로 제한하는 다른 더 깨끗한 방법이있을 것입니다. 이것들은 내가 원하는만큼 깨끗하지 않으며 누군가가 이것을하기 위해 더 깨끗한 방법을 가지고 있는지보고 싶습니다.