Ruby'də attr_accessor nədir?

attr_accessor anlamaq çətin olur. Kimsə bunu mənə izah edə bilərmi?

917
07 дек. dennismonsewicz 07 dekabrda təyin olundu . 2010-12-07 00:07 '10 at 0:07 2010-12-07 00:07
@ 20 cavab

Gəlin bir Person sinifiniz olduğunu söyləyin.

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

Şübhəsiz ki, biz heç bir name üsulunu tanımış deyilik. Mənə bunu edək.

 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 

Bəli, adını oxuya bilərik, amma bu, ad verə biləcəyimiz anlamına gəlmir. Bunlar iki fərqli üsuldur. Birincisi oxucu adlanır, son isə yazıçı adlanır. Hələ bir müəllif yaratmırıq, buna görə edək.

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

Yüksək İndi oxumaq və yazma üsullarını istifadə edərək, @name Məsələn dəyişənini yaza bilərik. Bundan əlavə, bu tez-tez edilir, hər zaman bu metodlara vaxt ayırmaq nədir? Biz bunu asanlaşdıra bilərik.

 class Person attr_reader :name attr_writer :name end 

Hətta bu təkrar ola bilər. Oxucu və yazarın yalnız aksesuar istifadə etmək istədikdə!

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

Eyni işləyir! İnsanın obyektindəki @name nümunə @name ilə etdiyimizdə eyni şəkildə müəyyən edəcəyik, buna görə də onu digər üsullarla da istifadə edə bilərsiniz.

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

Nədir? attr_reader , attr_writerattr_accessor metodlarının həqiqətən sizin üçün üsullar yaratdığını anlamaq üçün digər cavabları, kitabları, yaxud sənədləri oxuyun.

2133
07 дек. Cavab Max Çernyak 07 dekabrda verilir. 2010-12-07 01:11 '10 at 1:11 2010-12-07 01:11

attr_accessor yalnız bir üsuldur. (Bağlantı necə işlədiyinə dair daha ətraflı məlumat verməlidir - yaradılan üsulların cütlərinə baxın və təlimatçı onu necə istifadə etməyi göstərməlidir.)

Bu hiylə, Ruby-də (C ++ və Java kimi dillərdə "yalnız bir tərif") təsvir deyil, lakin qiymətləndirilmiş bir ifadədir. Bu qiymətləndirmə əsnasında attr_accessor metodu attr_accessor zaman, öz növbəsində, mövcud sinfi dəyişir - gizli alıcıları xatırlayın: self.attr_accessor , self bu nöqtədə açıq obyektin obyekti olduğu yer.

attr_accessor və dostlara ehtiyac, yaxşıdır:

  • Ruby, Smalltalk kimi, bu obyektin üsullarından 1 kənarında nümunə dəyişənlərə icazə vermir. Yəni, nümunə dəyişənlər Java, hətta Python deyildiyi kimi xy şəklində mövcud ola bilməzlər. Ruby'de y həmişə göndərmək üçün mesaj olaraq istifadə olunur (və ya "çağırmaq üsulu"). Beləliklə, attr_* metodları, attr_* @variable nümunənin dinamik şəkildə yaradılan üsullara @variable .

  • Kazan sucks

border=0

Ümid edirik ki, bu, bəzi detalları aydınlaşdırır. Xoşbəxt kodlaşdırma.


1 Bu tamamilə doğrudur və bunun ətrafında bəzi "metodlar" var, lakin "ictimai instansiya dəyişkənliyi" üçün sintaksis dəstəyi yoxdur.

117
07 дек. Cavab İstifadəçi tərəfindən verilir166390 07 dekabr . 2010-12-07 00:21 '10 at 0:21 2010-12-07 00:21

attr_accessor ( attr_accessor də göstərildiyi kimi) sadə bir üsuldur. Onun etdiyinə görə sizin üçün daha çox üsul yaradır.

Belə ki, bu kod burada:

 class Foo attr_accessor :bar end 

bu kodla bərabərdir:

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

Ruby'də bu metodu özünüz yaza bilərsiniz:

 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 дек. Phrogz tərəfindən verilmiş cavab 07 dekabr 2010-12-07 00:29 '10 at 0:29 2010-12-07 00:29

attr_accessor çox sadədir:

 attr_accessor :foo 

aşağıdakılar üçün bir etiketdir:

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

bir şey üçün bir alıcı / setter başqa bir şey deyil

36
07 дек. Cavab 07 fevral cümə günü verilir . 2010-12-07 00:28 '10 at 0:28 2010-12-07 00:28

Əsasən, onlar Ruby'nin yoxdur ki, saxta ictimai məlumatlar xüsusiyyətləri.

18
07 дек. Tyler Eaves tərəfindən verilmiş cavab 07 Dek 2010-12-07 00:11 '10 at 0:11 2010-12-07 00:11

Bu sadəcə dəyişənlər üçün getter və setter metodlarını müəyyən edən bir üsuldur. Tətbiqin nümunəsi:

 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 tərəfindən verilmiş cavab 07 Dek 2010-12-07 00:29 '10 at 0:29 2010-12-07 00:29

Bu problemə qaçdım və bu suala bir qədər uzun cavab yazdım. Bunun əvvəldən əla cavabları var, ancaq daha çox aydınlıq axtaran kimdir ki, mənim cavabım kömək edəcəkdir

Initialize metodu

Initialization, bir sinifin yeni bir nümunəsi yaratdığınız zaman kodunuzun ayrı bir xəttində yerləşdirmək deyil, bir nümunə yaratarkən bir obyektin bir nümunəsinə məlumat verməyə imkan verir.

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

Yuxarıda göstərilən kodda, Denis'i "Initialize" parametresiyle geçerek Denis'i başlatma yöntemini istifadə edərək, "Denis" adını verdik. Əgər biz başlanğıc üsulu olmadan adı təyin etmək istəyiriksə, bunu aşağıdakı kimi edə bilərik:

 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 

Yuxarıda göstərilən kodda, obyektin başlatıldığı zaman dəyərləri təyin etmək yerinə, person.name istifadə edərək attr_accessor setter metoduna zəng edərək adı təyin etdik.

Hər ikisi də bu işi yerinə yetirmək üçün "üsullar" olur, lakin başlatma vaxt və kod xətlərini saxlayır.

Bu yalnız başlatma vəzifəsidir. Başlatma işlemi bir üsul olaraq çağırılamaz. Bir nümunə obyektinin dəyərlərini almaq üçün getter və setter (attr_reader (get), attr_writer (set) və attr_accessor (hər ikisi) istifadə etmək lazımdır. Ətraflı məlumat üçün aşağıya baxın.

Getters, Setters (attr_reader, attr_writer, attr_accessor)

Getters, attr_reader: bütün getterin məqsədi müəyyən bir nümunə dəyişəninin dəyərini qaytarmaqdır. Aşağı qırmaq üçün aşağıda nümunə kodunu ziyarət edin.

 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 

Yuxarıda göstərilən kodda, "item_name" və "miqdar" metodlarını nümunə nümunəsində "məsələn" çağırırsınız. "Məsələn.item_name" və "example.quantity" qoyur (və ya "qəbul") "nümunəyə" ötürülən parametrlər üçün bir dəyər və ekranda göstərilir.

Xoşbəxtlikdən, Ruby bu kodu daha qısa bir şəkildə yazmağa imkan verən daxili bir üsula malikdir; attr_reader metodu. Aşağıdakı kodu nəzərdən keçirin;

 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 

Bu sözdizim eyni şəkildə işləyir, yalnız altı satırlıq kod saxlayır. Sınıfı ilə əlaqəli 5 əyalət varsa, Təsəvvür edin. Kod tezliklə sıxılacaq.

Setters, attr_writer: ilk setter üsulları ilə məni keçdi nə gözləmə məntəqəsində başlatma metodu üçün eyni funksiyanı yerinə yetirir. Aşağıdakı mənim anlayışım əsasında fərqi izah edirəm;

Yuxarıda qeyd edildiyi kimi, bir başlanğıc metodu, bir obyekt oluşturulduğunda bir nesne örneği değerlerini belirlemenize imkan verir.

Ancaq nümunəni yaratdıqdan sonra dəyərləri təyin etmək və ya başlatıldıqdan sonra onları dəyişdirmək istəyirsinizsə nədir? Setter metodundan istifadə edəcəyin script bu olacaq. FƏALİYYƏT NƏDİR? Attr_writer metodunu ilk dəfə istifadə etdiyinizdə xüsusi bir vəziyyəti "təyin etmək" lazım deyil.

Aşağıdakı, Item sınıfının bu instansiyası üçün item_name dəyərini elan etmək üçün setter metodundan istifadə etmək nümunəsidir. Xahiş edirik, attr_reader getter metodundan istifadə etməyi davam etdirəcəyik ki, biz dəyərləri əldə edə və ekranda çap edə bilərik ki, kodu özünüzə yoxlamaq istəsəniz.

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

Aşağıda, bizim kodlarımızı qısaltmaq və vaxt qənaət etmək üçün attr_writer istifadə nümunəsidir.

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

Aşağıda, başlanğıc örneğinin təkrarlama kodudur, burada yaradılması zamanı item_name obyektlərin dəyərini təyin etmək üçün başlanğıcdan istifadə edirik.

 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: bir attr_reader və attr_writer funksiyasını yerinə yetirir, başqa kod satırını saxlayır.

12
16 сент. cavab 16 sentyabr Jbur43 verilir 2015-09-16 04:03 '15 'da 4:03' de, 2015-09-16 04:03

OOP konsepsiyası ilə tanış olsanız, getter və setter metodları ilə tanış olmalısınız. attr_accessor Ruby-də eynidır.

Paylaşılan yolda Getter və Setter

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

Setter metodu

 def name=(val) @name = val end 

Getter metodu

 def name @name end 

Ruby'də Getter və Setter

 class Person attr_accessor :name end person = Person.new person.name = "Eshaan" person.name # => "Eshaan" 
11
08 февр. Cavab Ahmed Eshaan tərəfindən verilir 08 fevral. 2015-02-08 10:22 '15 'da 10:22' de 2015-02-08 10:22

Hər hansı bir kod olmadan sadə izahat

Yuxarıdakı cavabların əksəriyyəti koddan istifadə edir. Bu izahat heç bir analoji / hekayədən istifadə etmədən cavab verməyə çalışır:

Xaricilər CIA sirlərinə çıxa bilmirlər

  • CIA həqiqətən gizli bir yer düşünün. CIA içərisində olanlar istisna olmaqla, CIA-da nə baş verdiyini heç kim bilmir. Başqa sözlə, xaricilər CIA-da heç bir məlumat əldə edə bilmirlər. Lakin tamamilə gizli bir təşkilatda yaxşı bir şey olmadığından, xarici ölkəyə müəyyən məlumatlar verilir. Yalnız CIA hər kəsin bunu bilməsi üçün, məsələn: CIA direktoru, bu şöbənin digər bütün dövlət idarələri üçün necə ekoloji cəhətdən səmimi olduğunu və s. d. Digər məlumatlar: məsələn, İraqda və ya Əfqanıstanda gizli əməliyyat edən kimlərdirsə, bu cür şeylər gələcək 150 il ərzində gizli qalacaqdır.

  • CIA xaricində olsanız, məlumatı yalnız ictimaiyyətə çatdıra bilərsiniz. Və ya CIA dili istifadə, yalnız "təmizlənmiş" məlumat əldə edə bilərsiniz.

  • CIA, CİA xaricində ümumi ictimaiyyətə təqdim etmək istədiyi məlumatlara istinad edir: atributlar.

Oxumaq və yazma xüsusiyyətlərinin dəyəri:

  • CIA vəziyyətində, xüsusiyyətlərin əksəriyyəti yalnız oxunur. Bu, CİA-nın tərəfdarıyansanız, "CIA-nın direktoru kimdir?" Deyə soruşa bilərsiniz. və birbaşa cavab alacaqsınız. Amma yalnız oxumaq xüsusiyyətləri ilə ala bilməyəcəyiniz şeylər CIA-yə dəyişiklik etməkdir. məsələn, Kim Kardashianın rejissor olmaq istədiyini və ya Paris Hilton-in baş komandanı olmaq istədiyini birdən-birə qərara ala bilməzsiniz.

  • Atributlar sizə yazma imkanı verirsə, xaricində olsanız da dəyişiklik edə bilərsiniz. Əks halda, yalnız bir oxuya bilərsiniz.

    Başqa bir deyişlə, giriş aksessuarlar, xarici istifadəçilərə daxil olmaq və ya qeydiyyatdan keçmələrinə görə başqa cür imkan verməyən təşkilatlara sorğu göndərməyə və ya dəyişiklik etməyə imkan verir.

Bir sinif daxilində obyektlər bir-birinə asanlıqla daxil ola bilər.

  • Digər tərəfdən, artıq CIA-da olsaydınız, Kabildəki CIA əməliyyatçısını asanlıqla Kobulda zəng edə bilərsiniz, çünki bu informasiya artıq içərisində olduqda asanlıqla əldə edilə bilər. Amma CIA-nın xaricindəsinizsə, sadəcə giriş hüququ verilməyəcəkdir: kimin olduğunu bilməyəcəksiniz (oxumaq imkanı) və vəzifənizi dəyişdirə bilməzsiniz (yazma imkanı).

Dərsləri olan dəqiq şey və onların içərisində olan dəyişənlərə, xüsusiyyətlərə və üsullara giriş imkanı. NTN! Hər hansı bir sualınız xahiş edirəm və ümid edirəm ki, aydınlaşa bilərəm.

10
02 мая '16 в 7:55 2016-05-02 07:55 cavab BKSpurgeon verilir 02 May '16 da 7:55 2016-05-02 07:55

Hesab edirəm ki, yeni rubların / programcıların (məsələn, məni) qarışdıran bir hissəsi:

"Niyə bir xüsusiyyətə malik olduğumu (məsələn, bir ad) var və bu xüsusiyyətə bir qiymət düşdüyündə dəyər verə bilərəm?"

Bir az daha ümumiləşdirilmişdir, amma mənimlə necə tıkladı:

Verilənlər:

 class Person end 

Biz şəxsin bir ad və ya digər xüsusiyyətləri ola biləcəyi bir şey kimi tanımadıq.

Beləliklə, əgər:

 baby = Person.new 

... və onlara bir ad verin ...

 baby.name = "Ruth" 

Rubylandda Şəxs obyektinin sinfi bağlıdır və ya bir "ad" ola biləcəyi bir şey deyil, çünki başqa bir səhv alırıq!

Ancaq bu metodlardan hər hansı birini istifadə edə bilərik (əvvəlki cavablara bax): "Kişi ( baby ) sinifinin bir nümunəsi artıq" ad "adlı bir xüsusiyyətə malikdir, ona görə də biz bu adı almaq və konfiqurasiya etmək üçün sintaktik bir yola malikik, lakin bu bizim üçün əhəmiyyətlidir. "

Yenə də bu sualı bir az fərqli və daha ümumi bir açıdan təəccübləndirirəm amma ümid edirəm ki, bu mövzuya yol tapan şəxsin növbəti sinifinə kömək edəcəkdir.

10
10 июля '14 в 18:31 2014-07-10 18:31 Cavab Ben 10 iyul 'da 18:31' də verilir 2014-07-10 18:31

Sadə bir şəkildə qoyun ki, sinif üçün təyin edən və alıcı müəyyən edəcəkdir.

Xahiş edirik unutmayın

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

Beləliklə

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

sinfi üçün bir setter və alıcı müəyyən etmək üçün bərabərdir.

7
12 авг. Cavab Marcus Thornton 12 avqust tərəfindən verilir . 2014-08-12 11:30 '14 saat 11:30 'da 2014-08-12 11:30

Sadəcə attr-accessor müəyyən atributları üçün gettersetter üsulları yaradır.

5
17 марта '14 в 14:05 2014-03-17 14:05 Cavab 17: 17-də Vereru tərəfindən verilir. 14: 14: 2014-03-17 14:05

Bunu anlamaq üçün başqa bir üsul attr_accessor ilə düzəldilən səhv kodunu attr_accessor .

Məsələn:

 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 

Aşağıdakı üsullar mövcuddur:

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

Aşağıdakı üsullar bir səhv gətirə bilər:

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

ownerbalance texniki bir üsul deyil, bir xüsusiyyətdir. BankAccount sinifində sahibsiz və def balance . Bəli, onda iki əmrdən istifadə edə bilərsiniz. Amma bu iki üsul yoxdur. Lakin attr_accessor vasitəsilə metoddan istifadə etdiyiniz kimi atributlara daxil ola bilərsiniz! Buna görə sözü attr_accessor . Atribut. Accessor. Bir üsula giriş kimi xüsusiyyətlərə aiddir.

attr_accessor :balance, :owner əlavə attr_accessor :balance, :owner balanceowner "metodu" oxumaq və yazmaq imkanı verir. İndi son 2 üsuldan istifadə edə bilərsiniz.

 $ bankie.balance $ bankie.owner 
4
13 сент. Cavab 13 İyun tarixində verilir. 2016-09-13 21:26 '16 saat 21:26 2016-09-13 21:26

Adı bu simvolu olan .id2name olduğu bir nümunə dəyişənini (@name) yaradan və bu oxumaq üçün müvafiq giriş üsulu olan bu modul üçün adlandırılmış bir atributu təyin edir. Atributu təyin etmək üçün ad = adlı bir üsul da yaradılmışdır.

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

Accessor aka xüsusiyyət attr_accessor xülasə etmək üçün iki pulsuz üsul əldə edəcəksiniz.

Java kimi, onlar getters və seters deyilir.

Cavabların bir çoxu yaxşı nümunələr göstərdi, buna görə də yalnız qısa olacaq.

#the_attribute

#the_attribute =

Köhnə yaqut sənədlərində, haş etiketi bir üsul deməkdir. Bir sinif adı prefiksini də daxil edə bilər ... MyClass # my_method

1
14 нояб. Cavab Douglas G. Allen tərəfindən 14 noyabr tarixində verilir. 2016-11-14 06:56 '16 saat 06:56 'da 2016-11-14 06:56

Mən ruby ​​üçün yeni və yalnız növbəti qəribə fiqurlu olmalıdır. Gələcəkdə başqasına kömək edə bilər. Sonda, yuxarıda qeyd edildiyi kimi, 2 funksiya (def myvar, def myvar =) həm də gizli şəkildə @myvar saytına daxil olur, lakin bu üsullar yerli bildirişlər tərəfindən ləğv edilə bilər.

 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 янв. Cavab verilir Adverbly Jan 23 2019-01-23 17:58 '19, 5:58 pm 2019-01-23 17:58

Nitelikler ve Access Yöntemleri

Öznitelikler, nesnenin dışından erişilebilecek sınıf bileşenleri. Onlar bir çox digər proqramlaşdırma dillərində xüsusiyyətlər kimi tanınır. Onların dəyərlərinə object_name.attribute_name kimi "nöqtə notation" istifadə olunur. Python və bir neçə başqa dildən fərqli olaraq, Ruby obyektlərin kənarından birbaşa çıxışlara icazə vermir.

 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> 

Yuxarıdakı nümunədə c sinfi Avtomobilın bir nümunəsidir (obyekt). Dəyişən təkər nümunəsinin obyektdən kənar dəyərini oxumaq uğursuz çalışdıq. Beləliklə Ruby c c object daxilində təkər adlı bir üsul çağırmağa başladı, lakin bu üsul müəyyənləşdirilməyib. Qısacası, object_name.attribute_name bir obyekt daxilində attribute_name adlı bir üsul çağırmağa çalışır. Dəyişən təkər dəyişəninin dəyərinə çatmaq üçün bu adı istifadə edərək bir nümunə metodunu tətbiq etməliyik, bu çağırıldıqda bu dəyişənin dəyərini qaytarır. Buna giriş metodu deyilir. Ümumi proqramlaşdırma kontekstində nümunə dəyişəninə bir obyektdən kənara çıxmağın adi üsulu getter və setter üsulları kimi tanınan giriş metodlarını həyata keçirməkdir. Getter, sinfi xaricindəki bir dəyişənin dəyərini oxumağa imkan verir və setter xaricdən yazmaq imkanı verir.

Aşağıdakı misalda, dəyişən təkərlərə obyektin kənarından daxil olmaq üçün getmək və setter üsullarını Avtomobil sinifinə əlavə etdik. Getters və setters "ruby yolu" deyil; yalnız alıcı və setter üsullarının nə olduğunu göstərmək üçün xidmət edir.

 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 

Yuxarıdakı nümunə işləyir və bənzər kod, digər dillərdə getter və setter üsulları yaratmaq üçün istifadə olunur. Bununla belə, Ruby bunu daha asan bir şəkildə təmin edir: üç attr_reader, attr_writer və attr_acessor adlı daxili üsullar. Attr_reader metodu xaricdən oxunaqlı bir nümunə dəyişən edir, attr_writer yaza bilir və attr_acessor onu oxunaqlı və yazılabilir edir.

Yuxarıda göstərilən misal aşağıdakı kimi yazıla bilər.

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

Yuxarıdakı nümunədə, təkər atributu obyektin xaricindən oxumaq və yazmaq üçün istifadə oluna bilər. Attr_accessor əvəzinə attr_reader istifadə etsək, bu oxumaq olardı. Attr_writer istifadə etdikdə, yazı üçün yalnız olardı. Bu üç üsul özləri tərəfindən alıcılar və qurucular deyil, ancaq çağırıldıqda bizi əldə etmək və uyğunlaşdırmaq üçün üsullar yaradır. Bunlar dinamik (proqramlı) digər üsullar yaradan üsullardır; metaproqramlaşdırma adlanır.

Yerli Ruby metodlarını istifadə etməyən ilk (uzun) nümunə yalnız getter və setter üsullarında əlavə kod tələb olunduqda istifadə olunmalıdır. Məsələn, quraşdırma metodu bir nümunə dəyişən dəyər təyin etməzdən əvvəl verilənlərin doğrulmasını və ya bəzi hesablamaları yerinə yetirməyi tələb edə bilər.

Nümunə dəyişənləri obyektin kənarında quraşdırılmış üsullar example_variable_get və instance_variable_set istifadə edərək oxuya və yaza bilərsiniz. Lakin, bu, nadir hallarda əsaslandırılmış və adətən pis bir fikirdir, çünki encapsulasiya bypassı bütün növ xaoslara səbəb olur.

0
05 июля '16 в 14:41 2016-07-05 14:41 Cavab BrunoFacca tərəfindən verilir 05 iyul '14 saat 14:41 2016-07-05 14:41

Aşağıda bank hesabı nümunəsidir. Adı və ünvanı attr_accessor'da müəyyən edilir, beləliklə obyekt obyekt yaradıldığında obyektə keçirilir. Həm də oxumaq və yazmaq əməliyyatları üçün istifadə ediləcək. Attr_reader üçün atributlar sinfi obyektinin başlanğıcında obyektə keçirilir.

 sinif hesabı   attr_accessor: adı ,: ünvanı   attr_reader: id ,: balansdef initialize (adı, ünvanı) self.name = adı self.address = ünvan @balance = 0 @id = Random.rand (100)   son   def əmanət (pul) @balance + = pul puts "Deposited Rs #{money}"son  def check_balanceputs "Available balance is Rs #{balance}"son sonaccount1 = Account.new('John','Singapore')account1.deposit(100)account1.check_balance
0
ответ дан Rhunal 04 мая '17 в 9:53 2017-05-04 09:53

Hmmm Много хороших @. Вот мои небольшие центы.

  • attr_accessor - это простой метод, который помогает нам в очистке ( DRY-ing ) до повторяющихся методов getter and setter .

  • Итак, мы можем больше сосредоточиться на написании бизнес-логики и не беспокоиться о сеттерах и геттерах.

-2
ответ дан Abibullah Rahamathulah 04 авг. '17 в 15:50 2017-08-04 15:50

Основные функции attr_accessor по сравнению с другими - это возможность доступа к данным из других файлов.
Таким образом, вы обычно будете иметь attr_reader или attr_writer, но хорошей новостью является то, что Ruby позволяет объединить эти два вместе с attr_accessor. Я считаю, что это мой метод , потому что он более округлый или универсальный. Кроме того, обратите внимание, что в Rails это устраняется, потому что это делает это для вас в задней части. Итак, другими словами: вам лучше использовать attr_acessor над двумя другими, потому что вам не нужно беспокоиться о том, чтобы быть конкретным, аксессуар покрывает все это. Я знаю, что это скорее общее объяснение, но оно помогло мне в качестве новичка.

Надеюсь, это помогло!

-3
ответ дан creativegeek 17 июня '16 в 18:40 2016-06-17 18:40

Другие вопросы по метке или Задайте вопрос