Latest web development tutorials

روبي وجوه المنحى

روبي هي لغة وجوه المنحى نقية، روبي، كل شيء في شكل الكائنات. كل قيمة في روبي هو كائن، حتى الشيء الأكثر بدائية: الجمل، والأرقام، وصحيح حتى وكاذبة هي الكائنات. الفئة نفسها هوكائن موجودمثيلمنفئةالدرجة.يروي هذا الفصل الذي شرح جميع وظائف رئيسية مرتبطة وجوه المنحى روبي.

يستخدم فئة لتشكيل الكائن المحدد، والذي يجمع بين تمثيل البيانات وأساليب لتنظيم البيانات في حزمة وأنيق. ويطلق على البيانات الطبقة وأساليب أفراد الطبقة.

تعريف الفئة روبي

عند تعريف فئة، كنت في الواقع تحديد مخططا لنوع البيانات. هذا في الواقع لا يعرف أي بيانات، ولكن تعريف ما اسم وسائل الدرجة، وهذا هو القول، فإن تعريف ما يشكل كائن من الدرجة أن يكون، وما هي الإجراءات التي يمكن القيام بها على الكائن.

يبدأ تعريف الفئة معالطبقة الكلمة، يليه اسم الفئة،وتنتهي في نهاية المطاف مع تمثيل منفصل لحد من هذه التعريفات. على سبيل المثال، فإننا نستخدم الكلمة فئة لتحديد الطبقة صندوق، على النحو التالي:

class Box
   code
end

من الاتفاقية، يجب أن يبدأ اسم بحرف كبير، إذا كان يحتوي على أكثر من كلمة واحدة، تكبير الحرف الأول من كل كلمة، ولكن هنا لا يوجد محدد (على سبيل المثال: CamelCase).

تعريفات الكائن روبي

توفر الطبقة مخطط لكائن، وذلك أساسا، يتم إنشاء الكائن وفقا للفئة. نحن نستخدم الكلمةالجديدة للإعلان عن كائن الفئة.البيان التالي يعلن صندوق الطبقة كائنين:

box1 = Box.new
box2 = Box.new

تهيئة طريقة

تهيئة الأسلوب هو معيار أسلوب فئة روبي هو المنشئ للطبقة، على غرار أعمال البناءلغات البرمجة كائنية التوجه الأخرى. عندما تريد تهيئة بعض المتغيرات في فئة لإنشاء كائن في نفس الوقت، تهيئة طريقة يأتي في متناول اليدين. يأخذ طريقة سلسلة من الحجج، مثل أساليب روبي أخرى، وذلك باستخدام هذا الأسلوب، فإنه يجب أن توضعأمام الكلمة صفر،على النحو التالي:

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

المتغيرات سبيل المثال

المتغيرات مثيل فئة العقار التي يقومون بإنشائها عند استخدام كائن الفئة سوف تصبح ملكا للكائن.يتم تعيين الخصائص الفردية لكل كائن، بين أشياء أخرى، ولا تتشارك القيم. داخل الطبقة هو استخدام المشغل @ للوصول إلى هذه الخصائص خارج الصف، فمنالشائع استخدام طريقة تسمى طرق استرجاعالوصول. نحن هنا تحديدمربع طبقة فوق كمثال، وwidth صندوق الصف وheight كمتغيرات سبيل المثال.

class Box
   def initialize(w,h)
      # 给实例变量赋值
      @width, @height = w, h
   end
end

يمكنهم الدخول (استرجاع) واضع (واضع) طريقة

من أجل استخدام المتغيرات الخارجية للطبقة، يجب أن نحدد هذه المتغيرات فيأساليب الوصول الداخلية،استرجاع هوحاصلمايعادلها.يوضح المثال التالي طريقة استرجاع:

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Width of the box is : 10
Height of the box is : 20

على غرار طرق الوصول المستخدمة للوصول إلى قيم المتغيرات، روبي يوفر وسيلة لتعيين القيمة الخارجية المتغيرة من فئة A، المعروف أيضا باسمطريقة اضع محدد على النحو التالي:

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Width of the box is : 30
Height of the box is : 50

طرق المثال

تحديدأساليب سبيل المثال وغيرها من الأساليب المحددة، تستخدم لهم الكلمة مواطنه،ولكنها يمكن أن تستخدم فقط من قبل مثيل فئة، كما هو مبين في الأمثلة التالية. وظيفتها لا تقتصر على الوصول إلى المتغيرات سبيل المثال، ولكن أيضا وفقا للاحتياجات الخاصة بك للقيام بمهام أكثر الأخرى.

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Area of the box is : 200

أساليب الفئة الدرجة المتغيرات و

المتغيرات الطبقة كلها حالات من المتغيرات الدرجة المشتركة.وبعبارة أخرى، فإن المتغيرات مثيل فئة يمكن الوصول إلى كافة مثيلات الكائن. متغير فئة مع اثنين @ حرفا () كما بادئة، يجب تهيئة المتغيرات فئة في تعريف الفئة، كما هو مبين في الأمثلة التالية.

أسلوب فئة مواطنه self.methodname ()التعريف، أسلوب فئة لانهاء محدد. أساليب الفئة يمكن استخدامها مع شكل اسم الفئةclassname.methodname الدعوة، كما هو مبين في الأمثلة التالية:

#!/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()

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Box count is : 2

طريقة to_s

أي فئة لديها أسلوب مثيلto_s التي تحددها لإرجاع تمثيل سلسلة من الكائن.هنا مثال بسيط، وفقا للعرض وارتفاع تمثيل الأجسام صندوق:

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

String representation of box is : (w:10,h:20)

التحكم في الوصول

روبي يوفر لك مع ثلاثة مستويات من مثيل أساليب الحماية، والتي هيعامة أو خاصة أو محمية.أي تطبيق مراقبة الدخول ليس على سبيل المثال والطبقة المتغيرات روبي.

  • الطريقة الجمهور: طرق عامةيمكن أن يطلق أي كائن. افتراضيا، الأساليب العامة، باستثناء طريقة تهيئة دائما الخاص.
  • طرق خاصة: طرق خاصةلا يمكن الوصول أو ينظر إليها من خارج الصف. يمكن أن أساليب الفئة الوحيدة الوصول إلى أعضاء من القطاع الخاص.
  • لا يمكن إلا أن يسمىمحمية طريقة طبقة كائن والفئات الفرعية: طريقة المحمية.لا يمكن إلا أن يتم الحصول عليها في فئة الداخلية والفئات الفرعية.

هنا مثال بسيط يوضح بناء الجملة ثلاثة التعديل:

#!/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()

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية. هنا، نجحت استدعاء الأسلوب الأول، إلا أن الطريقة الثانية لديهم مشكلة.

Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height=20, @width=10> (NoMethodError)

الميراث الطبقة

الميراث، والبرمجة كائنية التوجه هي واحدة من أهم المفاهيم. الميراث يسمح لنا بتحديد فئة بناء على فئة أخرى، مما يجعل إنشاء وصيانة التطبيقات أسهل بكثير.

الميراث يساعد على إعادة استخدام رمز وتنفيذ سريع، لسوء الحظ، روبي لا يدعم راثة متعددة، ولكنmixins الدعم روبي.mixin مثل تطبيق معين من وراثة متعددة، وراثة متعددة، سوى جزء من واجهة هو توريث.

عند إنشاء فئة، يمكن للمبرمج تحديد فئة جديدة يرث من فئة الحالية للأعضاء، لذلك لا تكتب من الصفر أعضاء البيانات الجديدة وظائف الأعضاء. ويطلق على الطبقة الموجودة فيالفئة الأساسية أو الفئة الأصل، وتسمى الطبقة الجديدة الطبقات أو الفئات الفرعية المشتقة.

تقدم روبي أيضا فئة فرعية مفهوم فرعية أن يورث، ويوضح المثال التالي هذا المفهوم. تمديد تركيب فئة بسيطة جدا. فقط إضافة <حرف الاسم والفئة الأصل إلى العلبة العبارة الفئة. على سبيل المثال، يحدد ما يلي فئةBigBoxصندوق هي الفئة الفرعية:

#!/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()

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Big box area is : 200

الحمولة الزائدة طريقة

على الرغم من أنك يمكن أن تضيف ميزات جديدة في فئة مشتقة، ولكن أحيانا قد ترغب في تغيير سلوك تم تعريف في أساليب الفئة الأصل. ثم تتمكن من الحفاظ على نفسه اسم الأسلوب، وظيفة يمكن طاقتها الأساليب، كما هو مبين في الأمثلة التالية:

#!/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()

تشغيل إخراج المثال أعلاه هو:

Big box area is : 200

الحمولة الزائدة المشغل

نريد أن استخدام عامل التشغيل + بأداء إضافة متجه كائنين مربع، استخدم عامل * على العرض والارتفاع من صندوق تضاعفت باستخدام مشغل أحادي - العرض والارتفاع من صندوق تنتفي. هنا هو نسخة من الطبقة الرياضيات مع تعريف صندوق المشغل:

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

الكائن المجمدة

في بعض الأحيان، ونحن نريد لمنع تغيير كائن. في كائن، يمكن طريقة تجميد تحقيق ذلك، فإنه يمكن وضع فعال كائن إلى ثابت. أي كائن يمكن تجميد بالدعوةObject.freeze.الكائن المجمدة لا يمكن تعديل، وهذا هو، لا يمكنك تغيير المتغيرات سبيل المثال لها.

يمكنك استخدامObject.frozen؟ طريقة للتحقق ما إذا كان قد تم تجميدها كائن معين.إذا كان قد تم تجميد كائن، إرجاع الأسلوب صحيح، وإلا فإنها ترجع قيمة خاطئة. يوضح المثال التالي هذا المفهوم:

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
        from test.rb:39

الثوابت الطبقة

يمكنك تحديد فئة داخلية ثابتة، من خلال قيمة رقمية أو سلسلة مباشرة لتعريف متغير، والتي لا تتطلب استخدام @ ثابتة أو. وبطبيعة الحال فان اسم استخدام الأحرف الكبيرة المستمر.

مرة واحدة يتم تعريف ثابت، لا يمكنك تغيير قيمة لها، يمكنك الوصول إليها مباشرة الثوابت الداخلية في الصف، كما هو الوصول إلى نفس المتغير، ولكن إذا كنت ترغب في الوصول إلى الدرجة ثابتة الخارجية، ثم يجب عليك استخداماسم_الفئة :: المستمر ، كما هو مبين في الأمثلة التالية.

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Area of the box is : 200
TATA Inc
Box weight is: 10

الثوابت الدرجة يمكن أن تكون وراثية، ولكن أيضا نفس طاقتها أسلوب مثيل.

استخدام تخصيص إنشاء كائنات

قد تكون هناك قضية، كنت ترغب في إنشاء كائن دون استدعاء منشئتهيئة الكائن، يتم إنشاء هذا الكائن باستخدام أسلوب جديد، في هذه الحالة، يمكنك الاتصال تخصص لإنشاء كائن غير مهيأ، والأمثلة التالية على النحو التالي:

#!/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}"

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

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

معلومات الطبقة

النفس روبي وجافا هذا متشابهة، ولكن مختلفة. يتم الرجوع إليها طرق جافا في أسلوب مثيل، لذلك هذا يشير عادة إلى الكائن الحالي. سطر التعليمات البرمجية روبي سطرا، وذلك في سياق (السياق) النفس المختلفة لها معنى مختلف. دعونا نلقي نظرة على الأمثلة التالية:

#!/usr/bin/ruby -w

class Box
   # 输出类信息
   puts "Class of self = #{self.class}"
   puts "Name of self = #{self.name}"
end

عندما يتم تنفيذ التعليمات البرمجية أعلاه، وسوف تؤدي إلى النتائج التالية:

Class of self = Class
Name of self = Box

وهذا يعني أن الطبقة يمكن تعريف من قبل الطبقة ككائن الحالي للتنفيذ، ولكن يعني أيضا أن الطبقة الفوقية وتعريف أسلوب فئة الأم أثناء تنفيذ العملية المتاحة.