2012-11-09 5 views
8

다른 유형의 변수의 경우 ||=을 사용하지만 부울에는 사용할 수 없습니다 (x ||= true은 이전에 x가 false로 할당 된 경우에도 x를 true로 지정합니다).Ruby에서 어떻게 부울 기본값을 설정합니까?

나는이 일 것이라고 생각 것 :

x = true unless defined?(x) 

을하지만 그렇지 않습니다 : 어떤 이유로 X에 nil을 할당합니다.

I 작동 하나의 방법 알고있다. (여기에 대한 설명은 감사하겠습니다) :

unless defined?(x) 
    x = true 
end 

을하지만 오히려 자세한입니다. Ruby에서 부울 변수에 기본값을 할당하는 좀 더 간결한 방법이 있습니까?

+0

당신은 X는 (모든 의도와 목적을 위해 거짓에 해당) 무기 호에 할당하고 싶지 않은 이유가 ? –

+0

@ sylvain.joyeux 그가 '거짓'이 아니라 '사실'이되기를 원하기 때문입니다. –

+0

@ sylvain.joyeux 거짓 대신에 nil을 사용하는 것은 괜찮지 만,'|| = '의 문제는 해결하지 못합니다. '|| ='를 사용하여 x에 디폴트 값을 할당하려 할 때, x가 이전에 nil에 할당 되었다면, nil 값을 유지하기보다는 오버라이드됩니다 (nil은 false이므로). – evanrmurphy

답변

10

unless을 실행하기 전에 (이이 nil 그것을 만드는) x를 정의

defined?(x) or x = true 
x #=> true 
x = false 
defined?(x) or x = true 
x #=> false 

if/unless 블록을 수행 (if/unless 한 줄짜리) 대신 작동합니다 :

unless defined?(x) 
    x = true 
end 
x #=> true 
x = false 
unless defined?(x) 
    x = true 
end 
x #=> false 
+0

당신은 더 나은 설명과 함께 같은 대답 [대답] (http://stackoverflow.com/questions/12614805/weird-ruby-behaviour/12615158#12615158)으로 다시 한번 나를 펀치합니다. – sunnyrjuneja

+0

@SunnyJuneja 최근에 이것에 대해 뭔가 썼다는 것을 알았습니다 ... –

+0

감사합니다, Andrew. '정의 된 (x) 또는 x = true'는 훌륭하게 작동합니다. – evanrmurphy

1

Ruby에 이 아닌 true 값이 있습니다 (falsenil). 당신이해야 할 일은 그것들을 구별하는 것뿐입니다. 이 작업을 자동으로 수행 새로운 //= 운영자가 주변에 올 때까지, 당신이 붙어있어 :

if (x.nil?) 
    x = true 
end 

는 희망이 루비의 향후 버전에서 생략 할 수있다. 시간의 99 %는 실제로 두 가지가 아닌 실제 값의 차이를 신경 쓰지 않지만, 그렇게하는 시간의 1 %는 매우 드문 경우입니다.

변수 x이 로컬 변수로 "정의"되어 있으므로 defined? 연산자는 항상 해당 조건에 대해 "local-variable"을 반환합니다. defined?(nope)과 대조하면 변수가 존재하지 않기 때문에 nil이 표시됩니다. 루비는 문제가되는 변수 또는 상수와 관련이 있습니다. 변수 또는 상수가 으로 정의 된 경우가 아니라 값이으로 정의되었습니다. 당신은 다른 파서는 x =에 도달하고, 첫번째defined?이 있어야합니다

+4

아니면'x = true이면 x.nil? '이됩니다. 어쨌든'|| ='관용구보다 읽기 쉽습니다! – Gene

+0

나는 이것이 명백해 보일지 모르지만'class A; def self.check; 만약 x.nil이라면?; x = 참; 종료; 종료; 종료; A.check;'는 '정의되지 않은 지역 변수'예외를 반환합니다. – sunnyrjuneja

+0

포스터의 텍스트에 따라 실제로 틀릴 수도 있습니다. IRB에서 이렇게하면'undefined local variable' 예외가 발생합니다. 여기서 작업 예제에서는 포스터가 x = true를 지정하지 않습니다. – sunnyrjuneja

-1
x = defined?(x) ? true : false 
+0

-1 이렇게하면'x'가 이미'true' 인 경우에도'false'가됩니다. –

+0

@AndrewMarshall은'x'가 이미 '거짓'이라도 '사실'이라고 말하려고 했습니까? – evanrmurphy

+0

@evanrmurphy 네, 두 가지를 뒤집 었습니다. –

관련 문제