무엇입니까 !! 루비에서 의미?
!!루비에 무엇이 있는지 궁금합니다 .
아닙니다. 값을 부울로 변환하는 데 사용됩니다.
!!nil #=> false
!!"abc" #=> true
!!false #=> false
Ruby에 대한 유일한 잘못된 값은 niland false이므로 일반적으로 사용할 필요는 없으므로 일반적으로 해당 컨벤션을 유지하는 것이 가장 좋습니다.
그것을 다음과 같이 생각하십시오
!(!some_val)
합법적으로 사용되는 것 중 하나는 엄청난 양의 데이터가 반환되지 않도록하는 것입니다. 예를 들어 has_image?메소드 에서 3MB의 이미지 데이터를 리턴하지 않거나 메소드에서 전체 사용자 오브젝트를 리턴하지 않을 수 있습니다 logged_in?. 를 사용하면 !!이러한 객체를 단순 true/ 로 변환합니다 false.
그것은 돌려 true오른쪽에있는 객체가없는 경우 nil가 아닌 false, false이 경우 nil또는false
def logged_in?
!!@current_user
end
!부울 상태 부정을 의미하고, 두 !s는 이중 부정 이외의 특별한 것은 아닙니다.
!true == false
# => true
일반적으로 메소드가 부울을 리턴하도록 강제하는 데 사용됩니다. 문자열, 정수 및 그렇지 않은 것과 같은 모든 종류의 진실성을 감지하고 부울로 바꿉니다.
!"wtf"
# => false
!!"wtf"
# => true
더 실제 사용 사례 :
def title
"I return a string."
end
def title_exists?
!!title
end
부울이 리턴되도록하려는 경우에 유용합니다. 이럴 그것은보고하지만, 종류의 무의미의의 그 모두 if 'some string'와 if true동일한 흐름이지만, 어떤 사람들은 유용 명시 적으로 부울을 반환 찾을 수 있습니다.
이 관용구는 다른 프로그래밍 언어에도 존재합니다. C에는 내장 bool유형 이 없었 으므로 모든 부울은 int대신 표준 값 0또는 로 입력되었습니다 1. 이 예를 보자 (명확하게하기 위해 괄호가 추가됨) :
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
"not-not"구문은 0이 아닌 정수를 1표준 부울 true 값으로 변환합니다.
그러나 일반적 으로이 일반적인 관용구를 사용하는 것보다 합리적인 비교를하는 것이 훨씬 낫습니다.
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
독점 또는 을 수행해야하는 경우에 유용합니다 . Matt Van Horn의 답변에서 약간 수정하여 복사 :
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
두 변수가 모두 nil이거나 nil이 아닌 것을 확인하기 위해 사용했습니다.
raise "Inconsistency" if !!a ^ !!b
"이중 음수"이지만 연습은 권장되지 않습니다. rubocop를 사용 하는 경우 Style/DoubleNegation위반 으로 해당 코드에 대해 불평하는 것을 볼 수 있습니다.
이론적 근거 상태 :
이것은 암시 적이며 일반적으로 중복되므로 피해야
!!something합니다.!something.nil?
Understanding how it works can be useful if you need to convert, say, an enumeration into a boolean. I have code that does exactly that, using the classy_enum gem:
class LinkStatus < ClassyEnum::Base
def !
return true
end
end
class LinkStatus::No < LinkStatus
end
class LinkStatus::Claimed < LinkStatus
def !
return false
end
end
class LinkStatus::Confirmed < LinkStatus
def !
return false
end
end
class LinkStatus::Denied < LinkStatus
end
Then in service code I have, for example:
raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.
Effectively the bangbang operator has become what I might otherwise have written as a method called to_bool.
참고URL : https://stackoverflow.com/questions/524658/what-does-mean-in-ruby
'programing tip' 카테고리의 다른 글
| MDF 파일이란 무엇입니까? (0) | 2020.07.06 |
|---|---|
| try catch finally 블록 내에서 돌아 오는 것은 나쁜 습관입니까? (0) | 2020.07.06 |
| String 클래스는 + 연산자를 어떻게 재정의합니까? (0) | 2020.07.06 |
| Illustrator에서 웹용 SVG를 내보내는 데 가장 적합한 설정은 무엇입니까? (0) | 2020.07.06 |
| C ++에서 std :: function 또는 함수 포인터를 사용해야합니까? (0) | 2020.07.06 |