Najlepszy samouczek Ruby obiektowy W 2024 r. W tym samouczku możesz dowiedzieć się Definicja klasy Ruby,Definicje obiektów Ruby,zainicjować metody,zmienne instancji,Metoda dostępowe (dostępowe) i rozgrywający (rozgrywający),Metody instancji,Metody klasy zmienne Class &,metoda to_s,Kontrola dostępu,Klasa dziedziczenie,metoda przeciążenia,operator Przeciążenie,mrożone obiektu,stałe Klasa,Użyj przydzielić tworzenia obiektów,Klasa informacji,
Ruby jest czystym obiektowy język programowania, Ruby, wszystko jest w postaci obiektów. Każda wartość w Ruby jest obiektem, nawet najbardziej prymitywne rzeczą: łańcuchy, liczby, a nawet prawdziwe i fałszywe są obiektami. Klasa sama w sobie jestobiektem, któryjest instancjąklasydo klasy. Ten rozdział opowiada pan wyjaśnić wszystkie najważniejsze funkcje związane z obiektowego Ruby.
Klasa stosuje się do wytworzenia określonego obiektu, który łączy reprezentacji danych i metod do organizowania danych w pakiecie czyste. Dane i metody klasy są nazywane członków klasy.
Po zdefiniowaniu klasy, to faktycznie można zdefiniować plan dla typu danych. To rzeczywiście nie definiuje wszystkie dane, lecz definicja nazwa klasy środków, to znaczy, że definicja obiektu klasy będzie, i jakie może być wykonywane na obiekcie.
Definicja klasy zaczyna się odklasy słów kluczowych, anastępnienazwę klasy,a wreszcieskończyćz oddzielnej reprezentacji ograniczenia takie definicje. Na przykład, używamy słowa kluczowego class, aby zdefiniować klasę okna, co następuje:
class Box code end
Zgodnie z przyjętą konwencją, nazwa musi zaczynać się wielką literą, jeśli zawiera więcej niż jedno słowo, pierwszą literę każdego słowa, ale tutaj ma ogranicznik (na przykład: CamelCase).
Klasa dostarcza plan dla obiektu, więc w zasadzie, obiekt zostanie utworzony zgodnie z klasą. Używamy słowa kluczowegonew zadeklarować obiektu klasy.Poniższa instrukcja deklaruje polu klasie dwa obiekty:
box1 = Box.new box2 = Box.new
zainicjować metoda jest standardową metodą klasy Ruby jest konstruktor klasy, podobnie jak w innych językach programowania obiektowego prac konstruktorów.Gdy chcesz zainicjować niektóre zmienne w klasie utworzyć obiekt w tym samym czasie zainicjować metoda przydaje. Metoda wykonuje serię argumentów, podobnie jak inne metody Ruby, przy użyciu tej metody, musi być umieszczony wprzedniej części słowa kluczowego def,co następuje:
class Box def initialize(w,h) @width, @height = w, h end end
Nieruchomośćzmienne instancji klasy jest to, że tworzą one przy użyciu obiektu klasy staną się własnością obiektu.Poszczególne właściwości każdego obiektu jest przypisany, wśród innych przedmiotów, a nie dzielić wartości. W klasie jest użycie operatora @, aby uzyskać dostęp do tych właściwości poza klasą, to jestpowszechne w użyciu metody zwanej metody dostępowedostępu. Tutaj definiujemyBox klasę wyżej jako przykład, @width klasy Box i @height jako zmienne instancji.
class Box def initialize(w,h) # 给实例变量赋值 @width, @height = w, h end end
W celu wykorzystania zmiennych zewnętrznych klasy, musimy zdefiniować te zmienne w wewnętrznychmetod dostępu,Akcesor jest odpowiednikiemGetter.Poniższy przykład demonstruje sposób dostępowej:
#!/usr/bin/ruby -w # 定义类 class Box # 构造函数 def initialize(w,h) @width, @height = w, h end # 访问器方法 def printWidth @width end def printHeight @height end end # 创建对象 box = Box.new(10, 20) # 使用访问器方法 x = box.printWidth() y = box.printHeight() puts "Width of the box is : #{x}" puts "Height of the box is : #{y}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Width of the box is : 10 Height of the box is : 20
Podobnie jak w przypadku metod dostępu umożliwia dostęp do wartości zmiennych, Ruby zapewnia sposób ustawić zmienną wartość zewnętrznej klasy A, znany również jakometody setter, określony w następujący sposób:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 访问器方法 def getWidth @width end def getHeight @height end # 设置器方法 def setWidth=(value) @width = value end def setHeight=(value) @height = value end end # 创建对象 box = Box.new(10, 20) # 使用设置器方法 box.setWidth = 30 box.setHeight = 50 # 使用访问器方法 x = box.getWidth() y = box.getHeight() puts "Width of the box is : #{x}" puts "Height of the box is : #{y}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Width of the box is : 30 Height of the box is : 50
Określićmetodami instancji i innych metod zdefiniowanych, są za pomocą słowa kluczowego def,ale mogą one być stosowane tylko na przykład klasy, jak to pokazano w poniższych przykładach. Ich funkcja nie ogranicza się dostęp do zmiennych instancji, ale także w zależności od potrzeb, aby zrobić więcej innych zadań.
#!/usr/bin/ruby -w # 定义类 class Box # 构造方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 创建对象 box = Box.new(10, 20) # 调用实例方法 a = box.getArea() puts "Area of the box is : #{a}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Area of the box is : 200
Zmienne klasy są wszystkie instancje klasy dzielone zmiennych.Innymi słowy, zmienne instancji klasy można uzyskać wszystkie instancje obiektów. Klasa zmienną dwa @ znaków (@@) jako przedrostek, zmienne klasy muszą być inicjalizowane w definicji klasy, jak to pokazano w poniższych przykładach.
Metoda klasy def self.methodname ()definicja, metoda klasy kończyć ogranicznika. Metody klasy mogą być stosowane w postaci nazwy klasyclassname.methodname zawinięcia, jak to przedstawiono w następujących przykładach:
#!/usr/bin/ruby -w class Box # 初始化类变量 @@count = 0 def initialize(w,h) # 给实例变量赋值 @width, @height = w, h @@count += 1 end def self.printCount() puts "Box count is : #@@count" end end # 创建两个对象 box1 = Box.new(10, 20) box2 = Box.new(30, 100) # 调用类方法来输出盒子计数 Box.printCount()
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Box count is : 2
Każda klasa mato_s metodę instancji, które można zdefiniować zwraca ciąg znaków reprezentujący obiekt.Oto prosty przykład, w zależności od szerokości i wysokości stanowią obiekty kartonie:
#!/usr/bin/ruby -w class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 定义 to_s 方法 def to_s "(w:#@width,h:#@height)" # 对象的字符串格式 end end # 创建对象 box = Box.new(10, 20) # 自动调用 to_s 方法 puts "String representation of box is : #{box}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
String representation of box is : (w:10,h:20)
Ruby oferuje trzy poziomy ochrony metody instancji, które sąpubliczne, prywatne i chronione.Każda aplikacja kontroli dostępu nie ma na przykład Ruby i klasowych zmiennych.
Oto prosty przykład, który pokazuje składnię trzy modyfikatora:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法默认是 public 的 def getArea getWidth() * getHeight end # 定义 private 的访问器方法 def getWidth @width end def getHeight @height end # make them private private :getWidth, :getHeight # 用于输出面积的实例方法 def printArea @area = getWidth() * getHeight puts "Big box area is : #@area" end # 让实例方法是 protected 的 protected :printArea end # 创建对象 box = Box.new(10, 20) # 调用实例方法 a = box.getArea() puts "Area of the box is : #{a}" # 尝试调用 protected 的实例方法 box.printArea()
Gdy powyższy kod jest wykonywany, pojawia się następujące wyniki. Oto pierwsze wywołanie metody zakończy się pomyślnie, ale druga metoda będzie miał problem.
Area of the box is : 200 test.rb:42: protected method `printArea' called for # <Box:0xb7f11280 @height=20, @width=10> (NoMethodError)
Dziedziczenie, programowania obiektowego jest jednym z najważniejszych pojęć. Dziedziczenie pozwala nam na zdefiniowanie klasy na podstawie innej klasy, co sprawia, że tworzenie i utrzymywanie aplikacji jest znacznie łatwiejsze.
Dziedziczenie pozwala na ponowne wykorzystanie kodu i szybkie wykonanie, niestety, Ruby nie obsługuje wielokrotnego dziedziczenia, alewstawek wsparcia Ruby.wstawek jest niczym szczególnym realizacji wielokrotnego dziedziczenia wielokrotnego dziedziczenia, tylko część interfejsu jest dziedziczna.
Gdy tworzysz klasę, programista może określić nową klasę, która dziedziczy z klasy istniejącej członków, więc nie pisać od podstaw nowych członków danych i funkcji składowych. Istniejąca klasa jest nazywanaklasą bazową lub klasa dominująca, nowa klasa nazywa klas pochodnych lub podklasy.
Ruby zapewnia również podklasa podklasa koncepcja, która jest dziedziczona, Poniższy przykład ilustruje tę koncepcję. Rozszerzanie składni klasa jest bardzo prosta. Wystarczy dodać <nick postaci i klasy nadrzędnej do puszki oświadczenie klasy. Na przykład, co następuje definiuje klasęBigBoxBox jest podklasą:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 定义子类 class BigBox < Box # 添加一个新的实例方法 def printArea @area = @width * @height puts "Big box area is : #@area" end end # 创建对象 box = BigBox.new(10, 20) # 输出面积 box.printArea()
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Big box area is : 200
Chociaż można dodać nowe funkcje w klasie pochodnej, ale czasami może chcesz zmienić zachowanie zostało zdefiniowane w metodach klasy nadrzędnej. Następnie można zachować tę samą nazwę metody, funkcja ta może być przeciążony metod, jak to przedstawiono w następujących przykładach:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 定义子类 class BigBox < Box # 改变已有的 getArea 方法 def getArea @area = @width * @height puts "Big box area is : #@area" end end # 创建对象 box = BigBox.new(10, 20) # 使用重载的方法输出面积 box.getArea()
Uruchom wyjście Powyższy przykład to:
Big box area is : 200
Chcemy wykorzystać operator + wykonuje dodawanie wektora dwóch obiektów Box, użyj operatora * szerokości i wysokości Box pomnożona stosując operator jednoargumentowy - szerokość i wysokość Box zanegowane. Oto wersja klasy matematycznej z definicji Box Operator:
class Box def initialize(w,h) # 初始化 width 和 height @width,@height = w, h end def +(other) # 定义 + 来执行向量加法 Box.new(@width + other.width, @height + other.height) end def -@ # 定义一元运算符 - 来对 width 和 height 求反 Box.new(-@width, -@height) end def *(scalar) # 执行标量乘法 Box.new(@width*scalar, @height*scalar) end end
Zdarza się, że chcemy zapobiec obiekt zostanie zmieniony. W obiekcie, metody zamrażania można to osiągnąć, może skutecznie umieścić obiekt pod stałą. Każdy obiekt może być zamrożone przez wywołanieObject.freeze.Mrożone obiekt nie może być modyfikowane, to znaczy, że nie można zmienić jego zmienne instancji.
Można użyćObject.frozen metoda? by sprawdzić, czy dany obiekt został zamrożony.Jeśli obiekt został zamrożony, metoda zwraca wartość true, w przeciwnym razie zwraca wartość false. Poniższy przykład ilustruje tę koncepcję:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 访问器方法 def getWidth @width end def getHeight @height end # 设置器方法 def setWidth=(value) @width = value end def setHeight=(value) @height = value end end # 创建对象 box = Box.new(10, 20) # 让我们冻结该对象 box.freeze if( box.frozen? ) puts "Box object is frozen object" else puts "Box object is normal object" end # 现在尝试使用设置器方法 box.setWidth = 30 box.setHeight = 50 # 使用访问器方法 x = box.getWidth() y = box.getHeight() puts "Width of the box is : #{x}" puts "Height of the box is : #{y}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Box object is frozen object test.rb:20:in `setWidth=': can't modify frozen object (TypeError) from test.rb:39
Można zdefiniować stałą klasę wewnętrzną, przez bezpośrednią wartością liczbową lub string do definicji zmiennej, która nie wymaga ciągłego używania @ lub @@. Zgodnie z przyjętą konwencją, nazwa ciągłym użyciu wielkich liter.
Gdy stała jest zdefiniowana, nie można zmienić jego wartość, można bezpośrednio uzyskać dostęp do wewnętrznych stałych w klasie, podobnie jak dostęp do tej samej zmiennej, ale jeśli chcesz mieć dostęp do zewnętrznego stałą klasę, trzeba użyćclassname :: stałą jak przedstawiono w poniższych przykładach.
#!/usr/bin/ruby -w # 定义类 class Box BOX_COMPANY = "TATA Inc" BOXWEIGHT = 10 # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 创建对象 box = Box.new(10, 20) # 调用实例方法 a = box.getArea() puts "Area of the box is : #{a}" puts Box::BOX_COMPANY puts "Box weight is: #{Box::BOXWEIGHT}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Area of the box is : 200 TATA Inc Box weight is: 10
Stałe klasy mogą być dziedziczone, ale również taka sama jak metoda instancji jest przeciążony.
Może się zdarzyć, chcesz utworzyć obiekt bez wywoływania konstruktorazainicjować obiektu, obiekt jest tworzony za pomocą nowej metody, w tym przypadku, to może wywołać przeznaczyć na stworzenie niezainicjowanej obiektu, jak w poniższych przykładach w następujący sposób:
#!/usr/bin/ruby -w # 定义类 class Box attr_accessor :width, :height # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 使用 new 创建对象 box1 = Box.new(10, 20) # 使用 allocate 创建两一个对象 box2 = Box.allocate # 使用 box1 调用实例方法 a = box1.getArea() puts "Area of the box is : #{a}" # 使用 box2 调用实例方法 a = box2.getArea() puts "Area of the box is : #{a}"
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Area of the box is : 200 test.rb:14: warning: instance variable @width not initialized test.rb:14: warning: instance variable @height not initialized test.rb:14:in `getArea': undefined method `*' for nil:NilClass (NoMethodError) from test.rb:29
własny Ruby i Java to są podobne, ale inaczej. Metody Java odnoszą się metody instancji, więc to zwykle odnosi się do bieżącego obiektu. Kod Ruby linia po linii, to w innym kontekście (kontekst) Samo mieć inne znaczenie. Rzućmy okiem na poniższych przykładach:
#!/usr/bin/ruby -w class Box # 输出类信息 puts "Class of self = #{self.class}" puts "Name of self = #{self.name}" end
Jeżeli powyższy kod jest wykonywany, będzie produkować następujące wyniki:
Class of self = Class Name of self = Box
Oznacza to, że grupa może być określona przez klasę jako bieżącego obiektu do wykonania, lecz także oznacza, że meta-klasy i określenie klasy sposób nadrzędny podczas realizacji procesu są dostępne.