Latest web development tutorials

Ruby obiektowy

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.

Definicja klasy Ruby

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).

Definicje obiektów Ruby

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ć metody

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

zmienne instancji

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

Metoda dostępowe (dostępowe) i rozgrywający (rozgrywający)

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

Metody instancji

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

Metody klasy zmienne Class &

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

metoda to_s

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)

Kontrola dostępu

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.

  • Metoda publiczna: metody publicznemożna nazwać dowolny obiekt. Domyślnie, sposoby są jawne, z wyjątkiem sposobu proces się zawsze prywatne.
  • Prywatne Metody: Metody prywatnenie mogą być dostępne lub oglądane z zewnątrz klasy. Tylko metody klasy mogą uzyskać dostęp członków prywatnych.
  • Metoda chroniona: Metoda chronionamoże być wywołana tylko klasa obiektu i jego podklasy. Dostęp może być wykonywane tylko w klasie wewnętrznej i jej podklas.

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)

Klasa dziedziczenie

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

metoda przeciążenia

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

operator Przeciążenie

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

mrożone obiektu

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

stałe Klasa

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.

Użyj przydzielić tworzenia obiektów

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

Klasa informacji

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.