표현식을 평가 한 후 특정 변수가 바인드되었는지 여부를 알 수있는 방법이 있습니까?Erlang - 언 바운드 변수 확인
내 코드 : 나는 어떤 "후"또는하지 작업이 있는지 여부를 알고 필요한
{ok, After} = ts_dynvars:lookup(last, DynVars),
. 아마도 "ok"를 내 목적으로 사용할 수 있을까요?
감사합니다.
표현식을 평가 한 후 특정 변수가 바인드되었는지 여부를 알 수있는 방법이 있습니까?Erlang - 언 바운드 변수 확인
내 코드 : 나는 어떤 "후"또는하지 작업이 있는지 여부를 알고 필요한
{ok, After} = ts_dynvars:lookup(last, DynVars),
. 아마도 "ok"를 내 목적으로 사용할 수 있을까요?
감사합니다.
표현식에서 언 바운드 변수를 참조하려는 경우 컴파일 오류입니다. 특히
{ok, After} = ts_dynvars:lookup(last, DynVars),
후 2 가능성은있다 : 패턴이 일치하는 경우, After
바인딩이고, 사용될 수있다 그렇지 않은 경우 예외가 throw되고 After
과 작동하려고하는 코드는 절대로 실행되지 않습니다.
UPDATE :
당신이 패턴은 물론이
일치하지 않는 상황에서 지점 코드 실행하는 방법은 없습니다 나에게 말하고있다 :
case ts_dynvars:lookup(last, DynVars) of
{ok, After} -> ...;
_ -> ... %% or other patterns
end
하지만 컴파일러에서는 다른 분기에서 After
을 사용할 수 없으며 case
이후에는 사용할 수 없습니다 (모두 브랜치 바인딩 After
).
모든
에서이 예외를 잡을 수없는 때문이다 :
try
{ok, After} = ts_dynvars:lookup(last, DynVars),
...
catch
_:_ -> ...
end
그러나 다시, 당신은 catch
섹션 또는 try
이 끝난 후 After
를 사용할 수 없습니다 (당신 변수를 After
이라는 변수에 바인딩 할 수 있습니다.
패턴이 일치하지 않는 상황에서 코드 실행을 분기 할 수있는 방법이 없다고 말하고 있습니까? 즉이 예외는 전혀 포착 할 수없는 것입니까? – kellogs
@kellogs 업데이트 된 답변보기. –
3의 가능성 :
After
이 미 바인드하고 ts_dynvars:lookup/2
이 다음 After
이 (사본 제조) Value
에 바인딩 {ok,Value}
형태 의 결과를 반환하고 프로그램이 다음 행으로 이동 .After
은 이미 바인드되어 있으며 ts_dynvars:lookup/2
은 정확하게 {ok,After}
을 반환합니다. 패턴은 일치합니다. After
은 그 값을 유지합니다. 프로그램은 다음 줄로갑니다.ts_dynvars:lookup/2
은 {ok,After}
과 일치하지 않으며 이전 줄 2에 설명 된 과 같습니다. 그런 다음 실행이 중지되고 VM이 예외 {badmatch,Ret}
을 발생시킵니다.회선이 catch
또는 try
섹션에 있으면 프로세스가 계속 진행되고 그렇지 않으면 프로세스가 중단됩니다. 다음 코드 행 (있는 경우)은 절대로 실행되지 않습니다.
어떤 상황에서'After'는이 경우에 바인딩되지 않습니까? – kjw0188