2017-09-30 22 views
0

Ruby/Rails 테스트를 처음 사용했습니다. foo이 정의 된 경우 (즉, nil이 아님) Test :: Unit 메서드 assert_not_nil foo이 true 인 것 같습니다. 권리?assert_not_nil foo == assert가 정의 되었습니까? 루비의 테스트 :: 단위에서 foo?

assert defined? foo과 동일합니까?

그렇지 않은 경우 어떻게 다른가요? 그렇다면 내가 왜 다른 이들보다 선호하는 이유가 무엇입니까? assertassert_equalassert_not 등과 같은보다 전문적인 주장의 방법 대신에 다른 표현과 결합 될 수있는 것처럼

아마 더 일반적으로, 그것은 보인다 그러나 전문적인 방법이 더 표준적인 것 같다. 그게 맞습니까? 왜 그런가요?

답변

1

nil은 값이므로 값이 0 인 변수가 정의됩니다. 여기에 몇 가지 REPL의 출력을 보여입니다 : 정의되지 않은 인스턴스 변수에 접근하는 것도 nil을 반환하기 때문에

[1] pry(main)> a = nil 
=> nil 
[2] pry(main)> defined? a 
=> "local-variable" 
[3] pry(main)> defined? b 
=> nil 

당신은 혼란 수도 있지만, 여전히 동일 하 :

[4] pry(main)> defined? @b 
=> nil 
[5] pry(main)> @b = nil 
=> nil 
[6] pry(main)> defined? @b 
=> "instance-variable" 

전역 변수 ($foo가) 예처럼 작동 이 점에서 변수는 초기화되지만 초기화되지 않은 클래스 변수 (@@bar)에 액세스하면 NameError이됩니다.

마지막으로 로컬 변수는 Ruby에서 구문 분석 할 때 선언되므로 메서드의 모든 분기에서 로컬을 설정하면 해당 로컬은 메서드 또는 블록의 어느 곳에서나 정의되고 (nil으로 초기화됩니다.

+0

매우 유용한 답변입니다. 감사합니다. – globewalldesk

+0

그래서'foo = nil'이라면'assert defined? '는'assert_not_nil foo'는'false'입니까? foo'는'true'입니다. 권리? – globewalldesk

+1

맞습니다. – crazymykl