2010-01-13 2 views
10

이 구문 (안부 인증)을 사용하는 일부 코드를 사용하고 있습니다.무엇이 있습니까 !! 루비로 해?

def logged_in? 
    !!current_user() 
end 

이를 위해 인터넷 검색을 시도하지만, 그냥 무시하는 것 같다 "!", 어떻게 같은 문자열을 검색하는 방법에 대한 정보를 찾을 수 말해 줄 수 대답을 받아 들일 것입니다! google에서.

+3

문자는 뱅 (bang)이라고 부릅니다. "루비 더블 뱅"에 대한 인터넷 검색은 좋은 결과를 보여줍니다. – shsteimer

+0

아아, 그렇습니다. 느낌표가 깜박 거리는 것을 잊어 버렸습니다. 강타는 미국의 용어입니까? 영국에서는 소프트웨어 사용법에 대해서만 들어 본 적이 있습니다. 또 다른 예는 영국에서 일반적으로 C 해시라고하는 C#입니다. – Jim

+0

[가능한 것은 무엇입니까? 루비 의미합니까?] (http://stackoverflow.com/questions/524658/what-does-mean-in-ruby) –

답변

30

두 번 부정합니다. 첫 번째 !current_usernil 또는 false이 아닌 경우 false으로 변환합니다. 그 후에는 true으로 변환됩니다. 따라서 결과는 항상 부울 값이고 current_user 값이 아닙니다. current_userfalse 또는 nil이 아닌 경우 결과는 항상 true입니다. 그렇지 않으면 false입니다.

+7

예 : 그것 진실 또는 거짓 값을 진실로 부울 값으로 변환합니다 (true =>'true', falsey =>'false'). 이 질문을보십시오 : http://stackoverflow.com/questions/1310344 –

+0

이것은 임의의 값을 간단한 부울로 강제하기에 매우 편리합니다. – tadman

+0

모든 답변을 주셔서 감사합니다. 여러 사람들이 정말로 신속하게 질문에 답변했습니다. 가장 인기있는 답변을 정답으로 선택 했으므로 만족 스럽습니다. – Jim

3

이 문서는 동일한 코드를 사용하는 것 : 기본적으로

http://toolmantim.com/articles/bangbang_your_nil_is_dead

를, 단지를하지 (해당하는 의미처럼 보이는 !) 연산자를 두 번 사용합니다. 본질적으로 메서드가 true, false 또는 nil 대신 true 또는 false를 반환하도록 강요합니다. 전무를 반환합니다

def logged_in? 
    @current_user() 
end 

를 호출 @current_user이 전무 경우입니다

. true를 돌려줍니다 (싱글 플레이)

def logged_in? 
    [email protected]_user() 
end 

로 변경하고 추가 변경 (이중 탕)

def logged_in? 
    [email protected]_user() 
end 

는 false를 반환합니다 - 전무보다 더 많은 적용 (그리고 가능)이다.

def logged_in? 
    [email protected]_user().nil? 
end 

을하지만 @current_user이 거짓 일 때 그 사건을 포함하지 않으며, 나는 !!이보기 위하여 더 좋은 생각 :

또 다른 방법이 될 것이다 씁니다.

8

음수 연산자는 !입니다. 두 번입니다. 이것은 동일한 진리 값을 가지지 만 명시 적으로 부울 만 갖는 값을 제공합니다.

루비에 (falsenil 외에 아무것도) "true"로 간주됩니다 많은 값이 있고, 고려 몇 (모두 falsenil) "거짓"으로. 첫 번째 부정은 모든 참 값을 false으로 변환하고 모든 거짓 값은 true으로 변환합니다. 그런 다음 두 번째 부정은 원래 값과 동일한 진리 값을 갖는 값을 그대로 두지 만 실제 값 true 또는 false 만 허용합니다.

사람들이 logged_in?을 현재 사용자에게 액세스하는 방법으로 사용하지 못하도록하려는 경우 유용 할 수 있습니다. 대신 부울을 반환하기를 원합니다.

그것은 더 명확하고 자세한 정보에 해당 IT : "!"

def logged_in? 
    if current_user() 
    true 
    else 
    false 
    end 
end