공통 리스프
상태를 벡터에 바인딩 된 특수 변수의 수로 정의합니다. 따라서 특수 변수에 할당하면 상태가 변경됩니다.
(defgeneric state (object)
(:documentation "Get the state of this object."))
(defmethod state ((object vector))
;; The state of a vector is the number of symbols bound to it.
(let ((count 0))
;; Iterate each SYM, return COUNT.
(do-all-symbols (sym count)
;; When SYM is bound to this vector, increment COUNT.
(when (and (boundp sym) (eq (symbol-value sym) object))
(incf count)))))
(defparameter *a* #(this is a vector))
(defparameter *b* nil)
(defparameter *c* nil)
(print (state *a*))
(setf *b* *a*)
(print (state *a*))
(print (state *a*))
(setf *c* *a*)
(print (state *a*))
산출:
1
2
2
3
어휘 변수 나 개체 내 슬롯이 아닌 특수 변수에 대한 할당에서만 작동합니다.
조심해 do-all-symbols
모든 패키지를 패키지가없는 변수가 누락됩니다. 둘 이상의 패키지에 존재하는 기호를 두 번 계산할 수 있습니다 (한 패키지가 다른 패키지에서 기호를 가져온 경우).
루비
루비는 거의 동일하지만 상태를 배열을 참조하는 상수의 수로 정의합니다.
class Array
# Get the state of this object.
def state
# The state of an array is the number of constants in modules
# where the constants refer to this array.
ObjectSpace.each_object(Module).inject(0) {|count, mod|
count + mod.constants(false).count {|sym|
begin
mod.const_get(sym, false).equal?(self)
rescue NameError
false
end
}
}
end
end
A = %i[this is an array]
puts A.state
B = A
puts A.state
puts A.state
C = A
puts A.state
산출:
state-assign.rb:9:in `const_get': Use RbConfig instead of obsolete and deprecated Config.
1
2
2
3
이것은 클래스 나 모듈이 아닌 Ruby 객체에 대한 histocrat의 답변 을 일반화 한 것입니다 . 구성 상수는 경고를 만든 일부 코드를 자동로드하기 때문에 경고가 나타납니다.
LValue = obj
회선이 필요state
합니까? (저는 C #에서 매번 증가하는 속성을 만들 수 있습니다)