문제

내가 사용하고 있다고 가정 해 봅시다 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

아마도이 외에 블록으로 제한하는 다른 더 깨끗한 방법이있을 것입니다. 이것들은 내가 원하는만큼 깨끗하지 않으며 누군가가 이것을하기 위해 더 깨끗한 방법을 가지고 있는지보고 싶습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top