Kas yra „attr_accessor“ Ruby?

Man sunku suprasti, kaip attr_accessor Ruby. Ar kas nors man tai paaiškina?

917
07 дек. „dennismonsewicz “ nustatomas 07 d. 2010-12-07 00:07 '10 - 0:07 2010-12-07 00:07
@ 20 atsakymų

Tarkime, jūs turite Person klasę.

 class Person end person = Person.new person.name # => no method error 

Akivaizdu, kad niekada nenustatėme name metodo. Leiskite man tai padaryti.

 class Person def name @name # simply returning an instance variable @name end end person = Person.new person.name # => nil person.name = "Dennis" # => no method error 

Taip, mes galime skaityti vardą, bet tai nereiškia, kad galime priskirti vardą. Tai yra du skirtingi metodai. Pirmasis yra vadinamas skaitytoju, o paskutinis - rašytojas. Mes dar nesukūrėme autoriaus, todėl atlikite jį.

 class Person def name @name end def name=(str) @name = str end end person = Person.new person.name = 'Dennis' person.name # => "Dennis" 

Aukšta Dabar galime rašyti ir skaityti @name instancijos kintamąjį, naudodami skaitymo ir rašymo metodus. Be to, tai daroma taip dažnai, kodėl kiekvieną kartą šiems metodams praleisti laiką? Mes galime lengviau.

 class Person attr_reader :name attr_writer :name end 

Net ir tai gali pasikartoti. Kai norite, kad skaitytojas ir rašytojas tiesiog naudotųsi priedu!

 class Person attr_accessor :name end person = Person.new person.name = "Dennis" person.name # => "Dennis" 

Veikia tas pats! Ir @name ką: @name instancijos @name mūsų asmeniniame objekte bus nustatytas taip pat, kaip ir tada, kai mes tai padarėme rankiniu būdu, todėl galite jį naudoti kitais būdais.

 class Person attr_accessor :name def greeting "Hello #{@name}" end end person = Person.new person.name = "Dennis" person.greeting # => "Hello Dennis" 

Kas tai yra. Norėdami suprasti, kaip attr_writer , attr_writer ir attr_accessor metodai iš tikrųjų sukuria metodus jums, skaitykite kitus atsakymus, knygas, rubino dokumentus.

2133
07 дек. atsakymą pateikė Max Chernyak 07 d. 2010-12-07 01:11 '10 ne 1:11 2010-12-07 01:11

attr_accessor yra tik metodas. (Nuoroda turėtų suteikti daugiau informacijos apie tai, kaip ji veikia - peržiūrėkite sukurtų metodų poras ir pamoka turėtų parodyti, kaip ją naudoti.)

Apgaulė yra ta, kad class nėra „Ruby“ apibrėžtis (tai „tiesiog apibrėžimas“ kalbose, pvz., „C ++“ ir „Java“), tačiau tai yra išraiška, kuri yra vertinama. Tai atliekant šį vertinimą, kai attr_accessor metodas, kuris savo ruožtu keičia dabartinę klasę - prisiminti netiesioginį imtuvą: self.attr_accessor , kur šiuo metu self yra atviro objekto objektas.

attr_accessor ir draugų poreikis yra:

  • Ruby, kaip ir „Smalltalk“, neleidžia prieiti prie pavyzdžių kintamųjų už šio objekto 1 metodų. Tai reiškia, kad instancijos kintamieji negali būti prieinami kaip xy , kaip jie sako, „Java“ ar net „Python“. Ruby, y visada naudojamas kaip pranešimas, kurį reikia siųsti (arba „metodas skambinti“). Tokiu būdu, attr_* metodai sukuria įvyniojimus, kurie proxy suteikia prieigą prie @variable egzemplioriaus į dinamiškai sukurtus metodus.

  • Katilas įsiurbia

border=0

Tikimės, kad tai paaiškins kai kurias detales. Laimingas kodavimas.


1 Tai nėra visiškai teisinga, ir tai yra keletas „metodų“ , tačiau „viešojo pavyzdžio kintamojo“ nėra sintaksės palaikymo.

117
07 дек. atsakymas pateiktas vartotojo166390 07 dec. 2010-12-07 00:21 '10 - 0:21 2010-12-07 00:21

attr_accessor yra (kaip nurodyta @pst) paprastas metodas. Tai, ką jis daro, sukuria jums daugiau metodų.

Taigi šis kodas yra čia:

 class Foo attr_accessor :bar end 

atitinka šį kodą:

 class Foo def bar @bar end def bar=( new_value ) @bar = new_value end end 

Šį metodą galite parašyti Ruby:

 class Module def var( method_name ) inst_variable_name = "@#{method_name}".to_sym define_method method_name do instance_variable_get inst_variable_name end define_method "#{method_name}=" do |new_value| instance_variable_set inst_variable_name, new_value end end end class Foo var :bar end f = Foo.new p f.bar #=> nil f.bar = 42 p f.bar #=> 42 
64
07 дек. Atsakymas, kurį pateikė Phrogz Dec 07 2010-12-07 00:29 '10 - 0:29 2010-12-07 00:29

attr_accessor labai paprasta:

 attr_accessor :foo 

yra etiketė:

 def foo=(val) @foo = val end def foo @foo end 

tai nieko, bet tik objekto getter / seteris

36
07 дек. Atsakymas pateikiamas efalcao 07 dec. 2010-12-07 00:28 '10 - 0:28 2010-12-07 00:28

Iš esmės, jie yra suklastoti viešųjų duomenų atributai, kurių Ruby neturi.

18
07 дек. Atsakymas, kurį pateikė Tyler Eaves 07 Dec 2010-12-07 00:11 '10 - 0:11 2010-12-07 00:11

Tai tiesiog metodas, apibrėžiantis getter ir setter metodus, pvz., Kintamuosius. Įgyvendinimo pavyzdys:

 def self.attr_accessor(*names) names.each do |name| define_method(name) {instance_variable_get("@#{name}")} # This is the getter define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter end end 
17
07 дек. Chuck atsakymas 07 Dec 2010-12-07 00:29 '10 - 0:29 2010-12-07 00:29

Aš susidūriau su šia problema ir parašiau šiek tiek ilgą atsakymą į šį klausimą. Jau yra puikių atsakymų, bet, kas ieško daugiau paaiškinimų, tikiuosi, kad mano atsakymas padės

Inicijuoti metodą

Inicializavimas leidžia nustatyti duomenis objekto egzemplioriui kuriant egzempliorių, o ne nustatyti atskirą kodo eilutę kiekvieną kartą, kai kuriate naują klasės egzempliorių.

 class Person attr_accessor :name def initialize(name) @name = name end def greeting "Hello #{@name}" end end person = Person.new("Denis") puts person.greeting 

Pirmiau pateiktame kode mes pavadinimą „Denis“ nustatėme naudodami inicijavimo metodą, perduodami Dennis per Parametrą. Jei norėjome nustatyti pavadinimą be inicijavimo metodo, galėtume tai padaryti taip:

 class Person attr_accessor :name # def initialize(name) # @name = name # end def greeting "Hello #{name}" end end person = Person.new person.name = "Dennis" puts person.greeting 

Pirmiau pateiktame kode mes nustatome pavadinimą, vadindami attr_accessor setter metodą, naudodami person.name, o ne nustatant vertes, kai objektas inicijuojamas.

Abu šie veiksmai yra „metodai“, tačiau inicijavimas taupo laiką ir kodo eilutes.

Tai yra tik inicijavimo užduotis. Negalite skambinti inicijavimu kaip metodu. Kad gautumėte egzemplioriaus objekto reikšmes, turite naudoti getters ir setters (attr_reader (get), attr_writer (set) ir attr_accessor (abu). Išsamiau žr. Toliau.

Getters, Setters (attr_reader, attr_writer, attr_accessor)

Getters, attr_reader: visas getter tikslas yra grąžinti konkretaus atvejo kintamojo vertę. Apsilankykite žemiau pateiktame pavyzdiniame kode, kad jį sugadintumėte.

 class Item def initialize(item_name, quantity) @item_name = item_name @quantity = quantity end def item_name @item_name end def quantity @quantity end end example = Item.new("TV",2) puts example.item_name puts example.quantity 

Pirmiau pateiktame kode „item_name“ („elemento pavadinimas“) ir „kiekio“ metodai vadinami elemento pavyzdyje „pavyzdys“. Grąžina (arba „gauna“) parametrų, kurie buvo perduoti „pavyzdžiui“, vertę, ir parodo juos ekrane.

Laimei, Ruby turi įmontuotą metodą, kuris leidžia mums trumpiau parašyti šį kodą; attr_reader metodas. Žr. Toliau pateiktą kodą;

 class Item attr_reader :item_name, :quantity def initialize(item_name, quantity) @item_name = item_name @quantity = quantity end end item = Item.new("TV",2) puts item.item_name puts item.quantity 

Ši sintaksė veikia taip pat, tik ji išsaugo šešias kodo eilutes. Įsivaizduokite, jei turėtumėte dar 5 valstybes, susijusias su klasės elementu? Kodas greitai sugriežtinamas.

Setters, attr_writer: tai, kas pirmą kartą kerta mane su setter metodais, yra ta, kad mano akyse atrodo, kad atlieka tą pačią funkciją inicijavimo metodui. Žemiau paaiškinu skirtumą, pagrįstą mano supratimu;

Kaip minėta pirmiau, inicijavimo metodas leidžia nustatyti objekto pavyzdžio vertes, kai sukuriamas objektas.

Bet ką daryti, jei norite nustatyti vertes vėliau, sukūrę egzempliorių, arba keisdami juos po to, kai jie bus inicijuoti? Tai bus scenarijus, kuriame naudosite setter metodą. KAS YRA SKIRTUMAI. Jums nereikia „nustatyti“ konkrečios būsenos, kai pirmą kartą naudojate „attr_writer“ metodą.

Toliau pateikiamas pavyzdys, kaip naudojant setter metodą deklaruoti elemento_name reikšmę šiam elemento klasės egzemplioriui. Atkreipkite dėmesį, kad mes ir toliau naudojame attr_reader getter metodą, kad galėtume gauti vertes ir spausdinti jas ekrane, tik tuo atveju, jei norite patys patikrinti kodą.

 class Item attr_reader :item_name def item_name=(str) @item_name = (str) end end 

Žemiau pateikiamas pavyzdys, kaip naudoti attr_writer, kad vėl sutrumpintumėte mūsų kodą ir sutaupytume laiko.

 class Item attr_reader :item_name attr_writer :item_name end item = Item.new puts item.item_name = "TV" 

Toliau pateikiamas pirmiau pateikto iniciacijos pavyzdžio kartojimo kodas, kuriame mes naudojame iniciaciją, kad nustatytume elemento_name objektų reikšmę kūrimo metu.

 class Item attr_reader :item_name def initialize(item_name) @item_name = item_name end end item = Item.new("TV") puts item.item_name 

attr_accessor: atlieka tiek attr_reader, tiek attr_writer funkcijas, išsaugodamas kitą kodo eilutę.

12
16 сент. atsakymas pateikiamas Jbur43 rugsėjo 16 d 2015-09-16 04:03 '15 - 04:03 2015-09-16 04:03

Jei esate susipažinę su „OOP“ koncepcija, turėtumėte susipažinti su getter ir setter metodais. attr_accessor daro tą patį Ruby.

„Getter“ ir „Setter“ bendroje kelyje

 class Person def name @name end def name=(str) @name = str end end person = Person.new person.name = 'Eshaan' person.name # => "Eshaan" 

Setter metodas

 def name=(val) @name = val end 

Getter metodas

 def name @name end 

Getter ir Setter Ruby

 class Person attr_accessor :name end person = Person.new person.name = "Eshaan" person.name # => "Eshaan" 
11
08 февр. Atsakymą pateikė Ahmed Eshaan 08 Feb. 2015-02-08 10:22 '15, 10:22, 2015-02-08 10:22

Paprastas paaiškinimas be kodo

Dauguma pirmiau pateiktų atsakymų naudoja kodą. Šis paaiškinimas bando į jį atsakyti nenaudodamas jokių analogų / istorijų:

Nepriklausomi asmenys negali pasiekti CŽV paslapčių

  • Įsivaizduokite tikrai slaptą vietą: CŽV. Niekas nežino, kas vyksta CŽV, išskyrus CŽV viduje esančius žmones. Kitaip tariant, pašaliniai asmenys negali pasiekti jokios informacijos CŽV. Bet kadangi organizacija, kuri yra visiškai slapta, nėra nieko gero, tam tikra informacija yra pateikiama išoriniam pasauliui - tik tai, kad CŽV nori, kad visi apie tai žinotų, pavyzdžiui: CŽV direktorius, kaip ekologiškas šis skyrius yra skirtas visiems kitiems vyriausybės departamentams ir pan. d. Kita informacija: pavyzdžiui, kurie yra jos slaptieji darbuotojai Irake ar Afganistane, tikėtina, kad šie dalykai lieka paslaptingi per ateinančius 150 metų.

  • Jei esate už CIA ribų, galite pasiekti tik visuomenei prieinamą informaciją. Arba naudokite CIA kalbą, galite pasiekti tik „išvalytą“ informaciją.

  • Informacija, kurią CŽV nori teikti plačiajai visuomenei už CŽV, vadinama: atributais.

Skaitymo ir rašymo atributų vertė:

  • CIA atveju dauguma atributų yra tik skaitymui. Tai reiškia, kad jei esate CŽV rėmėjas, galite paklausti: „Kas yra CŽV direktorius?“ ir gausite tiesioginį atsakymą. Tačiau tai, ką jūs negalite padaryti su tik skaitymo atributais, yra pakeisti CŽV. Pavyzdžiui, jūs negalite skambinti ir staiga nuspręsti, kad norite, kad Kim Kardashian būtų direktorius, ar norite, kad Paris Hilton būtų vyriausiasis vadas.

  • Jei atributai suteikė jums rašymo prieigą, galite atlikti pakeitimus, jei norite, net jei esate lauke. Priešingu atveju galite skaityti tik vieną.

    Kitaip tariant, prieigai leidžia jums atlikti užklausas arba keisti organizacijas, kurios kitaip negalėtų leisti išoriniams vartotojams, priklausomai nuo to, ar jie naudojasi, ar ieško įrašų.

Klasės viduje esantys objektai lengvai pasiekiami.

  • Kita vertus, jei jau buvote CŽV, galite lengvai paskambinti savo CŽV operacijai Kabule, nes ši informacija yra lengvai prieinama, jei jau esate viduje. Bet jei esate už CŽV ribų, jums tiesiog nebus suteikta prieiga: jūs negalite sužinoti, kas jie yra (skaitymo prieiga), ir jūs negalite pakeisti savo misijos (rašymo prieigos).

Tikslus dalykas su klasėmis ir gebėjimas pasiekti kintamuosius, savybes ir metodus. NTN! Bet kokie klausimai, prašome, ir aš tikiuosi, kad galiu paaiškinti.

10
02 мая '16 в 7:55 2016-05-02 07:55 atsakymas pateikiamas BKSpurgeon 02 gegužės 16 d. 7:55 2016-05-02 07:55

Manau, kad dalis to, kas painioja naujus rubinus / programuotojus (pvz., Mane), yra:

„Kodėl aš negaliu tiesiog pasakyti egzemplioriui, kad jis turi atributą (pvz., Pavadinimą) ir suteikia šiam atributui vertę viename kritime?"

Šiek tiek labiau apibendrintas, bet čia jis paspaudė mane:

Atsižvelgiant į:

 class Person end 

Mes nenustatėme „Asmens“ kaip kažko, galinčio turėti pavadinimą ar kitus atributus.

Taigi, jei mes tada:

 baby = Person.new 

... ir pabandykite suteikti jiems vardą ...

 baby.name = "Ruth" 

Mes gauname klaidą , nes Rubylyje asmeninio objekto klasė nėra kažkas, kas yra prijungta arba gali turėti „vardą“ ... dar!

Bet mes galime naudoti bet kurį iš šių metodų (žr. Ankstesnius atsakymus) kaip būdą pasakyti: „Asmens ( baby ) klasės egzempliorius dabar gali turėti atributą, vadinamą„ vardas “, todėl mes ne tik turime sintaksinį būdą gauti ir konfigūruoti šį pavadinimą, bet tai mums prasminga. “

Vėlgi, šiek tiek kitokiu ir bendresniu požiūriu į šį klausimą, bet tikiuosi, kad tai padės kitam asmenybės klasės egzemplioriui, kuris suranda kelią į šią temą.

10
10 июля '14 в 18:31 2014-07-10 18:31 Ben atsakymą pateikė liepos 10 d. 14 d. 18:31 2014-07-10 18:31

Paprasčiau tariant, bus apibrėžtas klasės seteris ir getter.

Atminkite, kad

 attr_reader :v is equivalant to def v @v end attr_writer :v is equivalant to def v=(value) @v=value end 

Taigi

 attr_accessor :v which means attr_reader :v; attr_writer :v 

lygiavertis, kad būtų galima nustatyti seterį ir klasę.

7
12 авг. atsakymą pateikė Marcus Thornton 12 rug. 2014-08-12 11:30 '14, 11:30, 2014-08-12 11:30

Tiesiog attr-accessor sukuria getter ir setter metodus nurodytoms savybėms.

5
17 марта '14 в 14:05 2014-03-17 14:05 atsakymą pateikė Veeru kovo 17 d., 14 val. 14:05 2014-03-17 14:05

Kitas būdas suprasti tai yra išsiaiškinti, kokį klaidos kodą jis pataiso turėdamas attr_accessor .

Pavyzdys:

 class BankAccount def initialize( account_owner ) @owner = account_owner @balance = 0 end def deposit( amount ) @balance = @balance + amount end def withdraw( amount ) @balance = @balance - amount end end 

Galimi šie metodai:

 $ bankie = BankAccout.new("Iggy") $ bankie $ bankie.deposit(100) $ bankie.withdraw(5) 

Šie metodai sukelia klaidą:

 $ bankie.owner #undefined method `owner'... $ bankie.balance #undefined method `balance'... 

owner ir balance nėra techniškai metodas, o atributas. Banko sąskaitos klasė neturi def owner ir def balance . Jei taip, galite naudoti dvi žemiau esančias komandas. Tačiau šie du metodai nėra. Tačiau galite pasiekti atributus taip, lyg jūs naudojote metodą, naudodami attr_accessor !! Todėl žodis attr_accessor . Atributas. „Accessor“. Jis nurodo tokius požymius kaip prieiga prie metodo.

Pridėjus attr_accessor :balance, :owner leidžia skaityti ir rašyti balance ir owner „metodą“. Dabar galite naudoti paskutinius 2 metodus.

 $ bankie.balance $ bankie.owner 
4
13 сент. atsakymas įteiktas Iggy 13 Sep. 2016-09-13 21:26 '16 at 21:26 2016-09-13 21:26

Nustato šio modulio pavadinimą, kur pavadinimas yra simbolis .id2name, sukuriantis egzemplioriaus kintamąjį (@name) ir atitinkamą prieigos metodą, kad jį būtų galima perskaityti. Taip pat sukuriamas metodas, vadinamas name =, kad nustatytumėte atributą.

 module Mod attr_accessor(:one, :two) end Mod.instance_methods.sort #=> [:one, :one=, :two, :two=] 
2
11 авг. atsakymas pateikiamas Praveen_Shukla 11 rug . 2015-08-11 19:12 '15, 19:12, 2015-08-11 19:12

Apibendrinant accessor aka attribute attr_accessor, gausite du nemokamus metodus.

Kaip ir Java, jie vadinami geters ir seters.

Daugelis atsakymų parodė gerus pavyzdžius, todėl aš tik trumpai.

#the_attribute

ir

#the_attribute =

Senuose rubino dokumentuose maišos žymeklis reiškia metodą. Ji taip pat gali apimti klasės pavadinimą ... MyClass # my_method

1
14 нояб. Atsakymą pateikė Douglas G. Allen lapkričio 14 d. 2016-11-14 06:56 '16 at 6:56 am 2016-11-14 06:56

Aš esu naujas rubinas ir turėjau ką tik suprasti kitą keistumą. Ateityje gali padėti kitam asmeniui. Galų gale, kaip minėta, 2 funkcijos (def myvar, def myvar =) abu netiesiogiai pasiekia „@myvar“, tačiau šiuos metodus galima pakeisti vietinėmis deklaracijomis.

 class Foo attr_accessor 'myvar' def initialize @myvar = "A" myvar = "B" puts @myvar # A puts myvar # B - myvar declared above overrides myvar method end def test puts @myvar # A puts myvar # A - coming from myvar accessor myvar = "C"- local myvar overrides accessor puts @myvar # A puts myvar # C send "myvar=", "E" # - This is not running "myvar =", but instead calls setter for @myvar puts @myvar # E puts myvar # C end end 
0
23 янв. atsakymas duodamas Adverbly Jan 23 2019-01-23 17:58 '19, 17:58 pm 2019-01-23 17:58

Atributai ir prieigos metodai

Atributai yra klasės komponentai, kuriuos galima pasiekti iš objekto ribų. Jie yra žinomi kaip savybės daugelyje kitų programavimo kalbų. Jų reikšmės pasiekiamos naudojant „taškų žymėjimą“, kaip ir objekto_pavadinimas.pasirinkimo_pavadinimas. Skirtingai nuo „Python“ ir kelių kitų kalbų, „Ruby“ neleidžia patekti į atvejus, tiesiogiai iš objekto ribų.

 class Car def initialize @wheels = 4 # This is an instance variable end end c = Car.new c.wheels # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500> 

Pirmiau pateiktame pavyzdyje c yra klasės automobilio pavyzdys (objektas). Mes nesėkmingai bandėme perskaityti kintamo rato pavyzdžio vertę už objekto ribų. Taip atsitiko, kad Ruby bandė skambinti metodu, pavadintu rato viduje objektas c, tačiau šis metodas nebuvo apibrėžtas. Trumpai tariant, objektas_pavadinimas_pavadinimas_name bando iškviesti būdą, pavadintą atributas_name objekte. Norint pasiekti rato kintamojo vertę už jos ribų, turime įdiegti egzemplioriaus metodą, naudodami šį pavadinimą, kuris grąžins šio kintamojo vertę, kai skambins. Tai vadinama prieigos metodu. Bendrojo programavimo kontekste įprastas būdas pasiekti egzemplioriaus kintamąjį iš objekto ribų yra įdiegti prieigos metodus, dar vadinamus getter ir setter metodais. Getter leidžia jums skaityti kintamojo reikšmę, nustatytą viduje klasėje, ir seteris leidžia jums jį užrašyti išorėje.

Toliau pateiktame pavyzdyje prie „Car“ klasės pridėjome „getter“ ir „seters“ metodus, kad galėtume pasiekti kintamus ratus iš objekto. Tai nėra getterių ir steigėjų „rubino kelias“; tai tik iliustruoja, ką daro getter ir setter metodai.

 class Car def wheels # getter method @wheels end def wheels=(val) # setter method @wheels = val end end f = Car.new f.wheels = 4 # The setter method was invoked f.wheels # The getter method was invoked # Output: => 4 

Pirmiau pateiktas pavyzdys veikia ir panašus kodas paprastai naudojamas getter ir setter metodams kurti kitomis kalbomis. Tačiau Ruby suteikia paprastesnį būdą tai padaryti: trys įmontuoti metodai, vadinami attr_reader, attr_writer ir attr_acessor. „Attr_reader“ metodas leidžia egzemplioriaus kintamajam skaityti iš išorės, attr_writer leidžia jį rašyti, ir attr_acessor leidžia jį skaityti ir rašyti.

Anksčiau pateiktas pavyzdys gali būti perrašytas taip.

 class Car attr_accessor :wheels end f = Car.new f.wheels = 4 f.wheels # Output: => 4 

Pirmiau pateiktame pavyzdyje rato atributas bus prieinamas skaitymui ir rašymui iš objekto ribų. Jei vietoj attr_accessor mes naudojome attr_reader, tai būtų tik skaityti. Jei mes naudojome attr_writer, tai tik rašymas. Šie trys metodai savaime nėra getteriai ir steigėjai, bet, kai jie vadinami, jie sukuria metodus, kaip gauti ir pritaikyti mums. Tai yra metodai, kurie dinamiškai (programiškai) generuoja kitus metodus; metaprogramavimas.

Pirmasis (ilgesnis) pavyzdys, kuris nenaudoja įmontuotų Ruby metodų, turėtų būti naudojamas tik tada, kai getter ir setter metoduose reikalingas papildomas kodas. Pavyzdžiui, diegimo metodas gali pareikalauti duomenų patvirtinimo arba atlikti tam tikrus skaičiavimus prieš priskiriant kintamąją vertę.

Galite pasiekti (skaityti ir rašyti) egzempliorinius kintamuosius už objekto, naudodami integruotus metodus instance_variable_get ir instance_variable_set. Tačiau tai retai pateisinama ir paprastai bloga idėja, nes kapsulių apvažiavimas sukelia visų rūšių chaosą.

0
05 июля '16 в 14:41 2016-07-05 14:41 atsakymą pateikė BrunoFacca liepos 5 d. 16, 14:41 2016-07-05 14:41

Žemiau yra banko sąskaitos pavyzdys. Vardas ir adresas yra apibrėžti attr_accessor, todėl jie perduodami objektui, kai objektas sukuriamas. Jis taip pat bus naudojamas skaityti ir rašyti. „Attr_reader“, atributai perduodami objektui, kai inicijuojamas klasės objektas.

 klasės paskyra   attr_accessor: vardas, adresas  attr_reader :id, :balance   def initialize(name, address)self.name = nameself.address = address@balance = 0@id = Random.rand(100)  end  def deposit(money)@balance += money puts "Deposited Rs #{money}"   end  def check_balanceputs "Available balance is Rs #{balance}"   endendaccount1 = Account.new('John','Singapore')account1.deposit(100)account1.check_balance
0
ответ дан Rhunal 04 мая '17 в 9:53 2017-05-04 09:53