2009-08-28 12 views
156

Jaki jest cel operatora znaku zapytania w Ruby?Co oznacza operator znacznika zapytania w języku Ruby?

Czasami wydaje się to tak:

assert !product.valid? 

czasami to w if konstruktu.

+0

Znak zapytania na końcu funkcji nie jest operatorem, to zwykły znak. Znak zapytania wraz z dwukropkiem to trójskładnikowy operator warunkowy. Znak zapytania sam w sobie jest jednoargumentowym operatorem kwotowania. Zobacz http://stackoverflow.com/questions/16641205/what-does-the-unary-question-mark-operator-do –

Odpowiedz

215

Jest to konwencja stylu kodowania; wskazuje, że metoda zwraca wartość boolowską.

Znak zapytania jest prawidłowym znakiem na końcu nazwy metody.

+4

Dzięki, ale czy ta konwencja oznacza, że ​​robi to tylko _logic__ lub czy mogą wystąpić efekty uboczne? Zabawne, jak to jest w rodzaju hackowania wokół napisanych języków z typem zwracanym w kodzie. – Jason

+1

W tym przypadku jest to ściśle konwencja nazewnictwa metod. Nie ma wymuszania wartości zwracanej przez boolowską. Tylko dlatego, że nazwa metody kończy się znakiem zapytania, nie oznacza, że ​​metoda * musi * zwracać wartość logiczną ... ale zdecydowanie * powinna * zwracać wartość logiczną. Jednak istnieje kilka innych zastosowań '?' W Ruby (jest potrójnym operatorem, konwertującym znak na jego całkowitą ASCII, użycie w 'teście', w RegEx'es, itp.), Z których wiele jest omówionych w innych odpowiedziach tutaj. –

+2

@Jason FYI, nawet silnie typowane języki mają takie konwencje. Na przykład w metodach Javy, które zwracają wartość logiczną, często są poprzedzane "is", jak w 'isEmpty()', 'isDigit()', itp. W Ruby te same metody byłyby napisane 'puste?', I 'cyfra?', która jest trochę ładniejsza IMO. – Ajedi32

35

Konwencja w języku Ruby, że metody zwracające wartości logiczne kończą się znakiem zapytania. Nie ma większego znaczenia niż to.

5

Wierzę, że to tylko konwencja dla rzeczy, które są boolean. Trochę jak powiedzenie "IsValid".

+0

zwięzły i wspaniały komentarz specjalnie" Trochę jak mówienie "IsValid" –

14

W przykładzie

product.valid? 

Czy rzeczywiście wywołanie funkcji i wywołuje funkcję o nazwie valid?. Niektóre typy funkcji "test dla warunku"/boolean mają znak zapytania jako część nazwy funkcji zgodnie z konwencją.

+37

answer.gsub! (/ Function /, 'method') –

+0

Dobry komentarz ... lolz –

21

W twoim przykładzie to tylko część nazwy metody. W Ruby możesz również używać wykrzykników w nazwach metod!

Innym przykładem znaków zapytania w języku Ruby może być operator trójskładnikowy.

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

Aby rozwinąć odpowiedź Andy'ego, zobaczysz również rzeczy takie jak: nazwa klienta == użytkownik.logowana_na?? Nazwa użytkownika: "Kim jesteś?" Zwróć uwagę na podwójny znak zapytania –

1

Jest również stosowany w wyrażeniach regularnych, czyli „co najwyżej jedno powtórzenie poprzedniego znaku”

na przykład wyrażenie regularne /hey?/ mecze ze strun „he” i „hey”.

69

Należy również pamiętać ? wraz z charakterem, zwróci kod znaku ASCII dla A

Na przykład:

?F # => will return 70 

przemian w Ruby 1.8 można zrobić:

"F"[0] 

lub w rubinowy 1.9:

"F".ord 

Należy również zauważyć, że ?F zwróci ciąg znaków "F", więc aby skrócić kod, można również użyć ?F.ord w Ruby 1.9, aby uzyskać ten sam wynik, co "F".ord.

+2

Ciekawe, dziękuję – rtacconi

+25

W rubinach 1.9 zwróci '' F'' – klew

+2

Po prostu szukany szczegół –

0

To także wspólna konwencja korzystać z pierwszego argumentu metody test z 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 
+2

Nie jest to związane z 'test','? d' jest skrótem dla '" d "'. ' test' przyjmuje pierwszy ciąg znaków jako pierwszy argument, więc możesz wywołać go za pomocą 'test? d,"/dev "' lub 'test" d ","/dev "'. – bfontaine

10

Warto może podkreślić, że? S są dozwolone tylko w nazwach metod, a nie zmienne.W trakcie uczenia się Ruby, założyłem to? wyznaczył Boolean typ zwracany, więc próbowałem dodać je do zmiennych flag, prowadząc do błędów. To doprowadziło mnie do błędnego przekonania się przez pewien czas, że istnieje jakaś specjalna składnia z udziałem? S.

Stosowna: Why can't a variable name end with `?` while a method name can?