class_eval
을 사용하여 현재 클래스의 컨텍스트에서 실행될 코드를 작성합니다. 다음 코드에서는 속성 값의 변경에 카운터를 추가하려고합니다. 내 경우, class Foo
에서 -`class_eval` 문자열 내의 변수 범위는 무엇입니까?
class Class
def attr_count(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name # create the attribute's getter
class_eval %Q{
@count = 0
def #{attr_name}= (attr_name)
@attr_name = attr_name
@count += 1
end
def #{attr_name}
@attr_name
end
}
end
end
class Foo
attr_count :bar
end
f = Foo.new
f.bar = 1
class_eval
의 나의 이해는 런타임 클래스의 맥락에서 블록 을 평가하는 것입니다.
class Foo
attr_count :bar
@count = 0
def bar= (attr_name)
@attr_name = attr_name
@count += 1
end
def bar
@attr_name
end
end
위의 코드는 오류가 @count += 1
에 의해 발생, 말하는 오류가 발생하지만 : 나는로 실행 비슷한 위의 코드를 기대합니다. 왜 @count
에 nil:NilClass
이라는 슈퍼가 있습니까? 한편
(eval):5:in `bar=': undefined method `+' for nil:NilClass (NoMethodError)
는 @selman는 인스턴스 메서드 내에서 @count
할당을 넣을 수있는 솔루션을 제공하고 그것을 작동합니다. class Class
def attr_count(attr_name)
#...
class_eval %Q{
def #{attr_name}= (attr_name)
@attr_name = attr_name
if @count
@count += 1
else
@count = 1
end
end
#...
}
end
end
왜 변수 범위가 변경 되나요? class_eval
은 어떻게 다음 문자열을 실행합니까?
어떻게 CS169 클래스를 좋아 했습니까? :) –