Ruby'də << özbaşına 'sınıq

class << self bir class << self ?

773
24 марта '10 в 6:02 2010-03-24 06:02 Randombits , 24 Mart 'da saat 10: 00' da, 6: 02'de yer alır
paylaşmaq üçün mənbə
@ 7 cavab

Birincisi, sintaksis class << foo foo singleton sinifini (eigenclass) açır. Bu, bu xüsusi obyektin tapdığı üsulların davranışını ixtisaslaşmağa imkan verir.

 a = 'foo' class << a def inspect '"bar"' end end a.inspect # => "bar" a = 'foo' # new object, new singleton class a.inspect # => "foo" 

İndi sualına cavab vermək üçün: class << self açır, belə ki, cari self obyekti üçün (bu sinif və ya modulun bünövrəsi içərisində, sinif və ya modulun özü) metodlar ləğv edilə bilər. Bu, adətən sinif / modul metodlarını ("statik") müəyyən etmək üçün istifadə olunur:

 class String class << self def value_of obj obj.to_s end end end String.value_of 42 # => "42" 

Bu da bir kısaltma kimi yaza bilər:

 class String def self.value_of obj obj.to_s end end 

Və ya daha qısa:

 def String.value_of obj obj.to_s end 

Funksiya tərifinin içərisində, funksiya funksiyası çağırılan obyektə aiddir. Bu halda, class << self bu obyekt üçün bir tək sinf açır; Onlardan biri kasıb bir maşını olan bir maşının tətbiqi

 class StateMachineExample def process obj process_hook obj end private def process_state_1 obj # ... class << self alias process_hook process_state_2 end end def process_state_2 obj # ... class << self alias process_hook process_state_1 end end # Set up initial state alias process_hook process_state_1 end 

Beləliklə, yuxarıda verilən nümunədə StateMachineExample in hər bir process_hook alias process_hook ilə bir process_state_1 , lakin sonuncunda process_hook (yalnız digər, StateMachineExample təsir etmədən) process_state_2 əvvəlki process_state_2 . Beləliklə, hər dəfə zəng edən process metodunu çağırır ( process process_hook yenidən təyin process_hook üçün), davranış dəyişikliyə bağlı olaraq dəyişir.

822
24 марта '10 в 6:05 2010-03-24 06:05 Cavab Chris Jester-Young tərəfindən 24 Mart 10: 00-da saat 06: 30 -da veriləcək
üçün mənbə

Mən bu blogda class << self , Eigenclass və digər methods növünün sadə bir izahını Eigenclass .

Ruby'də bir sinifə tətbiq edilə biləcək üç üsul vardır:

  • Təqdim üsulları
  • Singleton üsulları
  • Class üsulları

Məsələn metod və sinif metodları eyni proqramlaşdırma dilində olduğu kimi eynidır.

 class Foo def an_instance_method puts "I am an instance method" end def self.a_class_method puts "I am a class method" end end foo = Foo.new def foo.a_singleton_method puts "I am a singletone method" end 

Eigenclass a daxil olmaq üçün bir yol ( Eigenclass üsullar daxildir) aşağıdakı sintaksisdir ( class << ):

 foo = Foo.new class << foo def a_singleton_method puts "I am a singleton method" end end 

İndi bu məzmunda Foo sinifinin özü olan bir özəllik üsulunu təyin edə bilərsiniz:

 class Foo class << self def a_singleton_and_class_method puts "I am a singleton method for self and a class method for Foo" end end end 
25
29 янв. cavab Saman Mohamadi tərəfindən verilir 2016-01-29 14:37 '16 saat 02:37 'da 2016-01-29 14:37
üçün mənbə

Tipik olaraq nümunə metodları qlobal metodlardır. Bu, onlar müəyyən edilmiş sinifin bütün nümunələrində mövcud olmağı deməkdir. Əksinə, monofonik üsul tək bir obyekt üzərində tətbiq olunur.

Ruby'yi siniflərdə saxlamaq üsulları və bütün üsullar siniflə əlaqəli olmalıdır. Singleton üsulunun müəyyənləşdirildiyi obyekt bir sinif deyildir (bu, bir sinifin nümunəsidir). Yalnız dərslər metodları saxlaya bilərsə, bir obyekt bir tək üsulu necə saxlaya bilər? Bir istifadəçi metodu yaradılıb, Ruby avtomatik olaraq bu metodu tutmaq üçün anonim bir sinif yaradır. Bu anonim dərslər, tək sinif sinifləri və ya özbaşisteşilər kimi tanınan metaclasses adlanır. Singleton metodu, öz növbəsində, singleton üsulunun müəyyənləşdirildiyi obyektlə əlaqəli olan metaklasla əlaqələndirilir.

Bir obyektdə bir neçə tək üsul müəyyənləşdirildikdə, hamısı eyni metaclassda saxlanılır.

 class Zen end z1 = Zen.new z2 = Zen.new class << z1 def say_hello puts "Hello!" end end z1.say_hello # Output: Hello! z2.say_hello # Output: NoMethodError: undefined method `say_hello'… 

Yuxarıdakı nümunədə, <z1 sinifi z1 obyektinin metaklasını göstərmək üçün mövcud özünü dəyişir; sonra metaclassda say_hello metodunu müəyyənləşdirir.

Dərslər də obyektlərdir (daxili sinif siniflərinin nümunələri). Class üsulları bir sinif obyekti ilə əlaqəli tək üsullardan daha çox şeydir.

 class Zabuton class << self def stuff puts "Stuffing zabuton…" end end end 

Bütün obyektlərin metaclasses ola bilər. Bu, dərslərin metaclasses ola bilər deməkdir. Yuxarıdakı nümunədə, sinif özünü dəyişir, belə ki Zabuton sinifinin metaklasını göstərir. Bir metod açıq bir qəbuledici (metodun müəyyənləşdiriləcəyi sinif / obyekt) olmadan müəyyən edildikdə, o, dolğun əhatədə, yəni özünün cari dəyərində örtük şəkildə müəyyən edilir. Buna görə, materialların metodu Zabuton sinifinin metaklasında müəyyənləşdirilir. Yuxarıda göstərilən bir nümunə, bir sinif üsulunu təyin etmək üçün başqa bir yoldur. IMHO, kodu daha anlaşılır hala gətirdiyi üçün sinif üsullarını müəyyən etmək üçün syntax def self.my_new_clas_method istifadə etmək daha yaxşıdır. Yuxarıdakı nümunə daxil edildi, belə ki <self syntax class ilə qarşılaşdığımızda nə baş verdiyini anlayırıq.

Ruby dərsləri ilə əlaqədar bu yazıdan daha çox məlumat tapa bilərsiniz.

12
26 июня '16 в 21:17 2016-06-26 21:17 Cavab BrunoFacca tərəfindən 26 iyun '16 'da 21:17 2016-06-26 21:17' də verilir
üçün mənbə

Hansı sinif?

 class Hi self #=> Hi class << self #same as 'class << Hi' self #=> #<Class:Hi> self == Hi.singleton_class #=> true end end 

[ self == thing.singleton_class onun blokunun kontekstində edir] .


Şey.singleton_class nədir?

 hi = String.new def hi.a end hi.class.instance_methods.include? :a #=> false hi.singleton_class.instance_methods.include? :a #=> true 

hi obyekt öz #methods #singleton_class.instance_methods , sonra #class.instance_methods .
Burada hi singleton sinifinə bir nümunə metodu veririk :a . Bu, <hi> ilə həyata keçirilə bilər.
hi #singleton_class bütün üsullarına malikdir, #class var və ehtimal ki, daha çox (burada bir).

[ #class üsulları #class #singleton_class birbaşa tətbiq edilə bilər. bir ruby ​​bir şey görəndə .O, ilk növbədə axtarır: thing.singleton_class.instance_methods metodunun təsviri və sonra thing.class.instance_methods]


Yeri gəlmişkən, onlar singleton sinfi obyektini == metaclass == eigenclass deyirlər .

12
12 нояб. Cavab lakesare 12 noyabrda verilir . 2015-11-12 17:03 '15 'da 17:03' de, 2015-11-12 17:03
üçün mənbə

Tək üsul isə yalnız bir obyekt üçün müəyyən edilmiş metoddur.

Məsələn:

 class SomeClass class << self def test end end end test_obj = SomeClass.new def test_obj.test_2 end class << test_obj def test_3 end end puts "Singleton methods of SomeClass" puts SomeClass.singleton_methods puts '------------------------------------------' puts "Singleton methods of test_obj" puts test_obj.singleton_methods 

Bəzi Class üsulları

test


Tək test_obj üsulları

test_2

test_3

3
15 сент. cavab artamonovdev 15 sep verilir . 2016-09-15 21:50 '16 saat 21:50 'da 2016-09-15 21:50
üçün mənbə

Əslində, Ruby layihələriniz üçün C uzantıları yazarsanız, modul üsulunu müəyyənləşdirmək üçün yalnız bir yol var.

 rb_define_singleton_method 

Mən bilirəm ki, bu müstəqil biznes sadəcə hər cür digər sualları açır, belə ki, hər bir hissəni nəzərdən keçirərək daha yaxşısını edə bilərsiniz.

Əvvəlcədən obyektlər.

 foo = Object.new 

Foo üçün bir üsul yaratmaq mümkündürmü?

Əlbəttə ki

 def foo.hello 'hello' end 

Bununla nə etməliyəm?

 foo.hello ==>"hello" 

Digər bir obyekt.

 foo.methods 

Obamanın bütün üsullarını və yeni bir şeyinizi alırsınız.

 def foo.self self end foo.self 

Yalnız bir foo obyekt.

Sınıf və Modul kimi digər obyektlərdən də foo edin, əgər nə baş verdiyini görməyə çalışın. Bütün cavabların nümunələri yaxşıdır, ancaq kodun yazıldığı şəkildə nə olduğunu başa düşmək üçün fərqli fikirlər və ya konsepsiyalar ilə işləməlisiniz. İndi siz baxmaq üçün bir çox şərt var.

Singleton, Class, Modul, Self, Object və Eigenclass qaldırıldı, lakin Ruby bu şəkildə obyekt modelləri adlandırmadı. Bu daha çox metaclass kimi. Richard və ya __ niyə burada bu fikri göstərər? Http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html Və sizə üz verir varsa, bir axtarış üçün Ruby obyekt modeli axtarış edin. YouTube-da tanıdığım iki video Deyv Thomas və Peter Koperdir. Həm də bu anlayışı izah etməyə çalışırlar. Deyvdən narahat olmayınca uzun bir müddət keçdi. Mən hələ də üzərində işləyirəm. Niyə buradayam? Sualınız üçün təşəkkür edirik. Standart kütüphaneye də baxın. FYI kimi bir tək modul var.

Bu çox yaxşıdır. https://www.youtube.com/watch?v=i4uiyWA8eFk

1
08 мая '17 в 16:29 2017-05-08 16:29 Cavab Douglas G. Allen tərəfindən 08 may 17'09 ' da 16:29 2017-05-08 16:29 tarixində verilir
üçün mənbə

Son vaxtlarda bu barədə yazılı bir məqalə yazılmışdı, amma qəbul edilən cavabın da yaxşı olduğunu düşünürəm. Bu sadəcə yardım ehtiyacı olanlar üçün alternativ bir izahat təmin edə bilər: https://medium.com/rubycademy/understanding-the-eigenclass-in-less-than-5-minutes-dcb8ca223eb4

0
18 янв. Cavab 18 yanvarda Stu verildi 2019-01-18 02:01 '19 saat 02:01 'də 2019-01-18 02:01
üçün mənbə