Instanču mainīgie rubīna mainīgajos

Kafija ar zīmi

H&S Produktion / Getty Images





Gadījumu mainīgie sākas ar zīmi at (@), un uz tiem var atsaukties tikai klases metodēs. Tie atšķiras no vietējiem mainīgajiem ar to, ka tie neeksistē nevienā konkrētā teritorijā darbības jomu . Tā vietā katram klases gadījumam tiek saglabāta līdzīga mainīgo tabula. Instanču mainīgie dzīvo klases instancē, tātad, kamēr šī instance paliks dzīva, arī instanču mainīgie dzīvos.

Uz instanču mainīgajiem var atsaukties jebkurā šīs klases metodē. Visas klases metodes izmanto vienu un to pašu gadījumu mainīgā tabula , atšķirībā no vietējiem mainīgajiem, kur katrai metodei būs atšķirīga mainīgo tabula. Tomēr ir iespējams piekļūt gadījumu mainīgajiem, iepriekš tos nedefinējot. Tas neradīs izņēmumu, bet mainīgā vērtība būs nulle un tiks parādīts brīdinājums, ja esat palaidis Ruby ar -in slēdzis.



Šis piemērs parāda gadījumu mainīgo izmantošanu. Ņemiet vērā, ka Shebang satur -in slēdzi, kas izdrukās brīdinājumus, ja tie parādās. Ņemiet vērā arī nepareizo lietojumu ārpus metodes klases tvērumā. Tas ir nepareizi, un tas ir apspriests tālāk.

Kāpēc ir @pārbaude mainīgais nav pareizs? Tas ir saistīts ar darbības jomu un to, kā Ruby īsteno lietas. Metodē instances mainīgā tvērums attiecas uz konkrēto šīs klases gadījumu. Tomēr klases tvērumā (klasē, bet ārpus jebkādām metodēm) darbības joma ir klases gadījums darbības jomu. Rubīns ievieš klašu hierarhiju, instantiējot Klase objekti, tāpēc ir a otrā instance spēlē šeit. Pirmais piemēram ir piemērs Klase klasē, un šī ir vieta @pārbaude ies. Otrais gadījums ir instantiācija TestClass , un šeit ir vieta @vērtība ies. Tas kļūst mazliet mulsinoši, taču atcerieties to nekad neizmantot @instance_variables ārpus metodēm. Ja jums nepieciešama visas klases krātuve, izmantojiet @@class_variables , ko var izmantot jebkur klases tvērumā (metožu iekšpusē vai ārpusē), un tā darbosies tāpat.



Aksesuāri

Parasti instanču mainīgajiem nevar piekļūt no objekta ārpuses. Piemēram, iepriekš minētajā piemērā jūs nevarat vienkārši piezvanīt t.vērtība vai t.@vērtība lai piekļūtu instances mainīgajam @vērtība . Tas pārkāptu noteikumus iekapsulēšana . Tas attiecas arī uz pakārtoto klašu gadījumiem, tie nevar piekļūt gadījumu mainīgajiem, kas pieder mātes klasei, lai gan tie tehniski ir viena veida. Tātad, lai nodrošinātu piekļuvi instanču mainīgajiem, palīgierīce metodes ir jādeklarē.

Šis piemērs parāda, kā var rakstīt piekļuves metodes. Tomēr ņemiet vērā, ka Rubīns nodrošina saīsni un ka šis piemērs pastāv tikai, lai parādītu, kā darbojas piekļuves metodes. Parasti nav ierasts redzēt šādā veidā rakstītas piekļuves metodes, ja vien piekļuvei nav nepieciešama papildu loģika.

Īsceļi padara lietas nedaudz vienkāršākas un kompaktākas. Ir trīs no šīm palīgmetodēm. Tās ir jāpalaiž klases tvērumā (klasē, bet ārpus jebkādām metodēm), un tās dinamiski definēs metodes līdzīgi kā iepriekš minētajā piemērā definētās metodes. Šeit nenotiek nekāda maģija, un tie izskatās kā valodas atslēgvārdi, taču tie patiešām ir tikai dinamiski definējošas metodes. Turklāt šie aksesuāri parasti ir klases augšgalā. Tas sniedz lasītājam tūlītēju pārskatu par to, kuri dalībnieku mainīgie būs pieejami ārpus klases vai bērnu klasēm.

Ir trīs no šīm piekļuves metodēm. Katrs no tiem ņem simbolu sarakstu, kas apraksta instanču mainīgos, kuriem jāpiekļūst.



    attr_reader- Definējiet “lasītāja” metodes, piemēram, nosaukums metodi iepriekš minētajā piemērā.attr_writer- Definējiet “rakstīšanas” metodes, piemēram, vecums = metodi iepriekš minētajā piemērā.attr_accessor- Definējiet gan 'lasītāja', gan 'rakstītāja' metodes.

Kad izmantot instanču mainīgos

Tagad, kad zināt, kas ir instanču mainīgie, kad jūs tos izmantojat? Gadījumu mainīgie ir jāizmanto, ja tie atspoguļo objekta stāvokli. Skolēna vārds un vecums, atzīmes utt. Tos nedrīkst izmantot pagaidu glabāšanai, jo tam ir paredzēti vietējie mainīgie. Tomēr tos, iespējams, varētu izmantot pagaidu glabāšanai starp metožu izsaukumiem daudzpakāpju aprēķiniem. Tomēr, ja to darāt, iespējams, vēlēsities pārdomāt metodes sastāvu un tā vietā pārveidot šos mainīgos par metodes parametriem.