Ruby에서 물음표 연산자는 무엇을 의미합니까?


211

Ruby에서 물음표 연산자의 목적은 무엇입니까?

때로는 다음과 같이 나타납니다.

assert !product.valid?

때로는 if구조에 있습니다.


2
함수 끝의 물음표는 연산자가 아니며 일반적인 문자입니다. 콜론과 함께 물음표는 삼항 조건 연산자입니다. 물음표 자체는 단항 따옴표 연산자입니다. 참조 stackoverflow.com/questions/16641205/...을
프로 올드

답변:


296

코드 스타일 규칙입니다. 메소드가 부울 값을 리턴 함을 나타냅니다.

물음표는 메소드 이름 끝에 유효한 문자입니다.


9
고맙지 만이 규칙은 논리 만 수행 하거나 부작용이있을 수 있다는 의미 입니까? 재밌는 방법은 코드에서 반환 유형을 사용하여 유형이 지정된 언어를 해킹하는 방법입니다.
Jason

5
이 경우 엄밀히 말하면 메소드 명명 규칙입니다. 부울 리턴 값은 시행되지 않습니다. 그냥 물음표의 메소드 이름의 끝은 방법이 있다는 것을 의미하지 않기 때문에 해야한다 부울을 반환 ...하지만 그것은 가장 확실히 해야 부울을 반환합니다. 그러나 ?Ruby에서 다른 몇 가지 용도 가 있습니다 (삼항 연산자, 문자를 ASCII 정수로 변환 test,에서 사용 , RegEx 등에서 사용).
Karl Wilbur

4
@Jason FYI, 강력한 형식의 언어조차도 이와 같은 규칙이 있습니다. 예를 들어, 자주로 시작하는 부울 값을 반환 Java 메소드에서와 같이 "입니다" isEmpty(), isDigit()등에서 루비, 같은 방법이 기록 될 것입니다 empty?, 그리고 digit?꽤 비트 좋네요은 IMO이다.
Ajedi32

3
Ajedi32-예, 그런 기능의 이름을 지정하는 것이 좋습니다 is. 항상 사용 합니다. 물음표가 다음에 사용 된 이후 Swift에서 온 누군가에게는 매우 혼란 스러울 수 있습니다 nullable.)
Jason

83

?문자와 함께 참고 사항에 대한 ASCII 문자 코드를 반환합니다A

예를 들면 다음과 같습니다.

?F # => will return 70

또는 루비 1.8에서는 다음과 같이 할 수 있습니다.

"F"[0]

또는 루비 1.9에서 :

"F".ord

또한 ?F문자열을 반환 "F"하므로 코드를 더 짧게 만들려면 ?F.ordRuby 1.9에서와 동일한 결과를 얻을 수도 있습니다 "F".ord.


29
루비 1.9에서 반환됩니다'F'
klew

39

부울 값을 반환하는 메서드가 물음표로 끝나는 것이 Ruby의 규칙입니다. 그 이상의 의미는 없습니다.


28

귀하의 예에서는 메소드 이름의 일부입니다. 루비에서는 메소드 이름에 느낌표를 사용할 수도 있습니다!

Ruby에서 물음표의 또 다른 예는 삼항 연산자입니다.

customerName == "Fred" ? "Hello Fred" : "Who are you?"

13
Andy의 답변을 확장하면 customerName == user.logged_in? ? user.name : "넌 누구 니?" 이중 물음표에 주목
Question Mark

16

당신의 예에서

product.valid?

실제로 함수 호출이며라는 함수를 호출합니다 valid?. 특정 유형의 "조건 테스트"/ 부울 함수에는 규칙에 따라 함수 이름의 일부로 물음표가 있습니다.


41
answer.gsub! (/ function /, 'method')
glenn jackman

15

?s는 변수가 아닌 메소드 이름에서만 허용 된다는 점을 지적 할 가치가 있습니다 . Ruby를 배우는 과정 ?에서 부울 리턴 유형 을 지정 했다고 가정 하여 변수를 플래그로 지정하여 오류를 유발했습니다. 이로 인해 ?s 와 관련된 특별한 구문이 있다고 잠시 동안 믿었습니다 .

관련성 : 왜 변수 이름이`?`로 끝나지 않고 메소드 이름은?


9

나는 그것이 부울 한 것들에 대한 관습이라고 생각합니다. " IsValid" 라고 말하는 것과 비슷 합니다.


1
간결하고 멋진 댓글 특별히 ""IsValid "라고 말하는 것과 비슷 함
Kick Buttowski

2

정규 표현식에도 사용되는데 "이전 문자의 최대 한 번의 반복"을 의미합니다.

예를 들어 정규식 /hey?/ 은 문자열 " he"및 " hey" 와 일치합니다 .


0

또한 Kernel # test 에서 테스트 메소드 의 첫 번째 인수와 함께 사용하는 것이 일반적입니다.

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true

이 질문 에서 볼 수 있듯이


3
그것은 관련이없는 것 test, ?d바로 가기입니다 "d". test한 문자 문자열을 첫 번째 인수로 사용하므로 test ?d, "/dev"또는로 호출 할 수 있습니다 test "d", "/dev".
bfontaine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.