Kodėl Ruby metoduose naudojami šauktukai?

Ruby, kai kurie metodai turi klausimyną ( ? ), Kuris užduoda klausimą dėl tipo include? kuris klausia, ar šis objektas yra įjungtas, tada grąžina teisingą / klaidingą.

Bet kodėl kai kurie metodai turi šauktuką ( ! ), O kiti ne?

Ką tai reiškia?

410
04 марта '09 в 23:02 2009-03-04 23:02 Lennie paklausė kovo 04 '09, 23:02 2009-03-04 23:02
@ 10 atsakymų

Apskritai, metodai baigiami ! , nurodo, kad metodas pakeis objektą, prie kurio jis vadinamas . Ruby juos vadina „ pavojingais metodais “, nes jie keičia būseną, prie kurios kažkas gali susieti. Štai paprastas styginių pavyzdys:

 foo = "A STRING" # a string called foo foo.downcase! # modifies foo itself puts foo # prints modified foo 

Tai bus:

 a string 

Standartinėse bibliotekose yra daug vietų, kuriose matysite lygiai taip pat pavadintų metodų porą ! ir vienas be. Be jų vadinami „saugūs metodai“ ir jie grąžina originalo kopiją su pakeitimais, taikomais kopijoms , ir vadinamasis vartotojas nekeičia. Čia yra tas pats pavyzdys be ! :

 foo = "A STRING" # a string called foo bar = foo.downcase # doesn't modify foo; returns a modified string puts foo # prints unchanged foo puts bar # prints newly created bar 

Išėjimas:

 A STRING a string 

Atminkite, kad tai tik konvencija, tačiau po to seka daug Ruby klasių. Jis taip pat padeda jums sekti savo kodo pakeitimus.

486
04 марта '09 в 23:04 2009-03-04 23:04 atsakymas suteiktas tgamblinui 04 m. kovo 09 d. 23:04 2009-03-04 23:04

Šūksmas - tai daug dalykų, ir kartais iš jo negalite daug pasakyti, išskyrus atvejus, kai „tai pavojinga, būkite atsargūs“.

Kaip kiti sakė, standartiniais metodais dažnai naudojamas metodas, kuris sukelia objekto mutaciją, bet ne visada. Atkreipkite dėmesį, kad daugelis standartinių metodų pakeičia imtuvą ir neturi šauktuko ( pop , shift , clear ), o kai kurie su šauktuko metodais imtuvas nekeičia ( exit! ). Pavyzdžiui, žr. Šį straipsnį .

Kitos bibliotekos gali ją naudoti įvairiais būdais. „Bėgių“ šūksnio ženklas dažnai reiškia, kad metodas išmeta išimtį, jei jis nepavyks ir nepavyks.

Tai yra pavadinimo konvencija, tačiau daugelis žmonių ją naudoja kitaip. Savo kode, gera taisyklė yra ją naudoti, kai metodas daro kažką „pavojingo“, ypač kai yra du tokiu pačiu pavadinimu būdai, o vienas iš jų yra „pavojingesnis“ nei kitas. „Pavojingas“ gali reikšti beveik viską.

117
05 марта '09 в 0:59 2009-03-05 00:59 atsakė Brian Carper kovo 05'09 val. 0:59 2009-03-05 00:59

Ši pavadinimo konvencija pašalinta iš schemos .

1.3.5

Pagal susitarimą procedūrų pavadinimai, kurie visada grąžina loginę vertę, paprastai baigiami ``? „“. Tokios procedūros vadinamos predikatais.

Pagal susitarimą procedūrų pavadinimai, kurie išsaugo vertybes anksčiau (žr. 3.4 skirsnį), paprastai baigiasi ``! „“. Tokios procedūros vadinamos mutacijos procedūromis. Pagal konvenciją mutacijos grąžinta vertė nėra apibrėžta.

56
05 марта '09 в 0:44 2009-03-05 00:44 atsakė Steven Huwig 05-08-09 , 0:44 2009-03-05 00:44

! paprastai reiškia, kad metodas veikia objektą, o ne grąžina rezultatą. Iš knygos „ Ruby“ programavimas :

Metodas, kuris yra „pavojingas“ arba modifikuoja imtuvą, gali būti vadinamas galutiniu „!“.

22
04 марта '09 в 23:04 2009-03-04 23:04 atsakymą pateikė „ Pesto “ kovo 04 d., 09:04 2009-03-04 23:04

Labiausiai tiksliai pasakyti, kad su Bang! pavojingesnė ar nuostabi versija . Yra daug metodų, kurie mutuoja be sprogimo, pvz., .destroy , ir bendrais metodais yra tik kirpčiukai, kur pagrindinėje bibliotekoje egzistuoja saugesnė alternatyva.

Pavyzdžiui, „Array“ sistemoje yra .compact ir .compact! , abu metodai .compact! masyvu, bet .compact! vietoj savęs grąžina nulį, jei masyve nėra nulio, o tai yra labiau stebina, nei tiesiog sugrįžti.

Vienintelis būdas be mutacijų, kurį .exit! su sprogimu, yra Kernel .exit! , kuris yra labiau stebina nei .exit , nes negalite sugauti SystemExit kol procesas SystemExit .

Bėgiai ir „ActiveRecord“ tęsia šią tendenciją, nes juose naudojama daugiau „netikėtų“ efektų, tokių kaip .create! , kuri sukelia klaidų gedimo metu.

13
16 февр. Atsakymas pateikiamas „ BookOfGreg “ 16 vasario mėn. 2014-02-16 01:38 '14 at 1:38 2014-02-16 01:38

Nuo themomorohoax.com:

Daužimas gali būti naudojamas žemiau, pagal mano asmeninius pageidavimus.

1) Aktyvaus rašymo metodas sukelia klaidą, jei metodas nedaro to, ką jis pasakys.

2) Aktyvusis įrašymo metodas išsaugo įrašą arba metodas išsaugo objektą (pvz., Juostelės!)

3) Metodas daro kažką „nereikalingo“, pvz., Pranešimus tam tikroje vietoje arba kai kuriuos veiksmus.

Faktas yra tai, kad naudokite tik smūgį, kai iš tiesų apie tai galvojote, būtina, kad kiti kūrėjai erzina, patikrinkite, kodėl naudojate smūgį.

Maiše pateikiamos dvi rekomendacijos kitiems kūrėjams.

1) nereikia išsaugoti objekto po to, kai paskambinsite į metodą.

2) kai skambinate metodu, db bus pakeistas.

http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods

13
09 сент. atsakymą pateikė Edward Castaño 09 rugsėjis 2011-09-09 03:05 '11 at 3:05 2011-09-09 03:05

Paprastas paaiškinimas:

 foo = "BEST DAY EVER" #assign a string to variable foo. => foo.downcase #call method downcase, this is without any exclamation. "best day ever" #returns the result in downcase, but no change in value of foo. => foo #call the variable foo now. "BEST DAY EVER" #variable is unchanged. => foo.downcase! #call destructive version. => foo #call the variable foo now. "best day ever" #variable has been mutated in place. 

Bet jei kada nors downcase! metodu downcase! pirmiau pateiktame paaiškinime foo bus nuolat keičiamas į tuščią. downcase! nepaleis naujo eilutės objekto, bet pakeis eilutę vietoje, visiškai pakeisdamas foo į apačią. Siūlau nenaudoti „ downcase! nebent tai yra absoliučiai būtina.

6
14 сент. Atsakymas pateikiamas Mirage 14 Sep. 2013-09-14 14:51 '13, 14:51 PM 2013-09-14 14:51

Vadinamas „naikinamaisiais metodais“. Jie linkę keisti originalią objekto kopiją, į kurią kalbate.

 numbers=[1,0,10,5,8] numbers.collect{|n| puts n*2} # would multiply each number by two numbers #returns the same original copy numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array numbers # returns [nil,nil,nil,nil,nil] 
1
23 мая '17 в 17:43 2017-05-23 17:43 Atsakymą davė Mittinti Ramana Murthy 1717 m. Gegužės 23 d. 17:43
 ! 

Man patinka galvoti apie tai kaip sprogstamąjį pakeitimą, kuris sunaikina viską, kas jam teko. Sprogimo ženklas reiškia, kad jūs nuolat pakeisite savo kodą.

Jei naudojate, pvz., „Ruby“ metodą pasauliniam „ gsub! pakeitimui gsub! tada jūs atliekate nuolatinį pakeitimą.

Kitas būdas, kurį galite įsivaizduoti, yra atidaryti tekstinį failą ir atlikti paiešką bei pakeisti ir išsaugoti. ! daro tą patį jūsų kode.

Kitas naudingas priminimas, jei ateinate iš „bash“ pasaulio, yra sed -i , jis turi tokį patį poveikį kaip ir visada išsaugant pakeitimus.

0
03 апр. Atsakymą pateikė Charlie Wood balandžio 03 d 2017-04-03 18:16 '17 at 6:16 pm 2017-04-03 18:16

Apatinė eilutė: metodai ! tiesiog pakeiskite skambinto objekto vertę, o metodas be ! grąžina kontroliuojamą vertę be įrašo į objektą, kuriam buvo taikomas metodas.

Naudokite ! , jei nenorite naudoti pradinės vertės, išsaugotos kintamajame, kuriam jūs vadinote metodą.

Norėčiau daryti kažką panašaus:

 foo = "word" bar = foo.capitalize puts bar 

Or

 foo = "word" puts foo.capitalize 

Vietoj

 foo = "word" foo.capitalize! puts foo 

Bet kuriuo atveju norėčiau vėl gauti pradinę vertę.

0
24 июля '15 в 0:10 2015-07-24 00:10 atsakymą davė Charlesas liepos 24 d. 15 d. 0:10 2015-07-24 00:10