Latest web development tutorials
×

Ruby หลักสูตร

Ruby หลักสูตร Ruby แนะนำโดยย่อ Ruby สิ่งแวดล้อม Ruby ติดตั้ง Linux Ruby ติดตั้ง Windows Ruby การเข้ารหัสจีน Ruby เลือกบรรทัดคำสั่ง Ruby ตัวแปรสภาพแวดล้อม Ruby ไวยากรณ์ Ruby ชนิดข้อมูล Ruby คลาสและวัตถุ Ruby กรณีระดับ Ruby ตัวแปร Ruby ผู้ประกอบการ Ruby หมายเหตุ Ruby เงื่อนไข Ruby การไหลเวียน Ruby ทาง Ruby กลุ่ม Ruby โมดูล Ruby เชือก Ruby แถว Ruby กัญชา Ruby วันที่และเวลา Ruby ขอบเขต Ruby iterator Ruby input และ output ไฟล์ Ruby File ชั้นเรียนและวิธี Ruby Dir ชั้นเรียนและวิธี Ruby ผิดปกติ

Ruby การสอนที่ทันสมัย

Ruby เชิงวัตถุ Ruby นิพจน์ปกติ Ruby การเข้าถึงฐานข้อมูล - DBI หลักสูตร Ruby MySQL Ruby CGI โครงการ Ruby CGI ทาง Ruby CGI Cookies Ruby CGI Sessions Ruby ส่ง Email SMTP Ruby Socket โครงการ Ruby XML, XSLT, XPath Ruby Web Services Ruby multithreading Ruby JSON Ruby RubyGems

ทับทิมเชิงวัตถุ

ทับทิมเป็นภาษาเชิงวัตถุบริสุทธิ์ทับทิมทุกอย่างอยู่ในรูปแบบของวัตถุ ค่าในแต่ละทับทิมเป็นวัตถุแม้สิ่งดั้งเดิมที่สุด: สตริง, ตัวเลข, และแม้กระทั่งความจริงและเท็จเป็นวัตถุชั้นเองเป็นวัตถุที่เป็นตัวอย่างของการเรียนคลาสบทนี้จะบอกคุณอธิบายฟังก์ชั่นทั้งหมดที่สำคัญที่เกี่ยวข้องกับทับทิมเชิงวัตถุ

ชั้นถูกนำมาใช้ในรูปแบบวัตถุที่ระบุซึ่งรวมการแสดงข้อมูลและวิธีการในการจัดระเบียบข้อมูลลงในแพคเกจที่เรียบร้อย ข้อมูลการเรียนและวิธีการที่เรียกว่าสมาชิกของชั้นเรียน

การกำหนดระดับทับทิม

เมื่อคุณกำหนดชั้นเรียนคุณจริงกำหนดพิมพ์เขียวสำหรับชนิดข้อมูลที่ นี้ที่จริงไม่ได้กำหนดข้อมูลใด ๆ แต่ความหมายของสิ่งที่ชื่อของวิธีการเรียนที่เป็นที่จะบอกความหมายของสิ่งที่ถือว่าเป็นวัตถุของคลาสจะเป็นและการกระทำที่สามารถดำเนินการในวัตถุ

การกำหนดระดับชั้นเริ่มต้นด้วยคำหลักตามด้วยชื่อชั้นและในที่สุดก็จบลงด้วยการเป็นตัวแทนแยกลดคำจำกัดความดังกล่าวตัวอย่างเช่นเราใช้คำระดับเพื่อกำหนดระดับชั้นกล่องดังต่อไปนี้:

class Box
   code
end

โดยการประชุมชื่อที่จะต้องเริ่มต้นด้วยอักษรตัวใหญ่ถ้ามันมีมากกว่าหนึ่งคำใช้ตัวอักษรตัวแรกของแต่ละคำ แต่นี่คือไม่มีตัวคั่น (ตัวอย่างเช่น: CamelCase)

ทับทิมคำจำกัดความของวัตถุ

ระดับให้พิมพ์เขียวสำหรับวัตถุดังนั้นโดยทั่วไปวัตถุที่ถูกสร้างขึ้นให้สอดคล้องกับการเรียนเราใช้คำหลักใหม่ที่จะประกาศเป็นวัตถุชั้นเรียนข้อความต่อไปนี้ขอประกาศในตู้ชั้นสองวัตถุ:

box1 = Box.new
box2 = Box.new

เริ่มต้นวิธีการ

วิธีการเริ่มต้นเป็นวิธีการเรียนทับทิมมาตรฐานคือคอนสตรัคของชั้นคล้ายกับเขียนโปรแกรมเชิงวัตถุภาษาอื่น ๆ งานคอนสตรัคเมื่อคุณต้องการที่จะเริ่มต้นตัวแปรบางอย่างในชั้นเรียนเพื่อสร้างวัตถุในเวลาเดียวกันเริ่มต้นวิธีการมาในสะดวก วิธีการใช้ชุดของการขัดแย้งเช่นวิธีทับทิมอื่น ๆ โดยใช้วิธีการนี้จะต้องมีการวางไว้ในด้านหน้าของคำหลักdef ดังต่อไปนี้:

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

accessors (เข้าถึง) และ Setter (Setter) วิธีการ

เพื่อที่จะใช้ตัวแปรภายนอกของชั้นที่เราจะต้องกำหนดตัวแปรเหล่านี้ในวิธีการเข้าถึงภายในเข้าถึงเป็นทะเยอทะยานเทียบเท่าตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการเข้าถึง:

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

วิธีการเช่น

กำหนดวิธีตัวอย่างและวิธีการอื่น ๆ ที่กำหนดไว้พวกเขาจะใช้คำ defแต่พวกเขาเท่านั้นที่สามารถนำมาใช้โดยอินสแตนซ์ชั้นเรียนดังแสดงในตัวอย่างต่อไปนี้ ฟังก์ชั่นของพวกเขาไม่ได้ถูก จำกัด การเข้าถึงตัวแปรเช่น แต่ยังเป็นไปตามความต้องการของคุณดำเนินงานอื่น ๆ

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

วิธีการเรียนและตัวแปรระดับ

ตัวแปรที่ทันสมัยในทุกกรณีของตัวแปรระดับที่ใช้ร่วมกันในคำอื่น ๆ เช่นตัวแปรระดับที่สามารถเข้าถึงได้ทุกกรณีวัตถุ ตัวแปรที่มีสองชั้น @ ตัวอักษร (@@) เป็นคำนำหน้า, ตัวแปรระดับจะต้องเริ่มต้นได้ในการกำหนดชั้นดังแสดงในตัวอย่างต่อไปนี้

วิธีการเรียน def 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 ที่คุณกำหนดที่จะกลับมาเป็นตัวแทนสตริงของวัตถุนี่คือตัวอย่างง่ายๆตามที่กว้างและความสูงแสดงวัตถุ Box:

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

การควบคุมการเข้าถึง

ทับทิมช่วยให้คุณมีสามระดับของการป้องกันเช่นวิธีการซึ่งเป็นภาครัฐภาคเอกชนหรือการป้องกันโปรแกรมใด ๆ การควบคุมการเข้าถึงไม่ได้อยู่ในทับทิมอินสแตนซ์และชั้นตัวแปร

  • วิธีสาธารณะ: วิธีการสาธารณะสามารถเรียกว่าวัตถุใด ๆโดยค่าเริ่มต้นวิธีการเป็นสาธารณะยกเว้นสำหรับวิธีการเริ่มต้นอยู่เสมอส่วนตัว
  • วิธีการส่วนตัว: วิธีการเอกชนไม่สามารถเข้าถึงหรือมองจากนอกชั้นเรียนวิธีการเรียนเท่านั้นที่สามารถเข้าถึงสมาชิกส่วนตัว
  • วิธีป้องกัน: ป้องกันวิธีเท่านั้นที่สามารถเรียกว่าชั้นวัตถุและ subclasses ของมันการเข้าถึงเท่านั้นที่สามารถดำเนินการในระดับภายในและ subclasses ของมัน

นี่เป็นตัวอย่างง่ายๆที่แสดงให้เห็นถึงไวยากรณ์สามปรับปรุง:

#!/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 เป็นเหมือนการดำเนินงานในด้านการมรดกหลายมรดกหลายเพียงส่วนหนึ่งของอินเตอร์เฟซเป็นที่สืบทอด

เมื่อคุณสร้างชั้นโปรแกรมเมอร์สามารถระบุระดับใหม่ที่สืบทอดมาจากชั้นที่มีอยู่ของสมาชิกจึงไม่เขียนจากรอยขีดข่วนใหม่สมาชิกข้อมูลและฟังก์ชั่นสมาชิกชั้นที่มีอยู่จะเรียกว่าชั้นฐานหรือระดับผู้ปกครองชั้นใหม่ที่เรียกว่าชั้นเรียนมาหรือ subclasses

ทับทิมยังมีแนวคิดประเภทรองซับคลาสที่สืบทอดตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิดนี้ การขยายชั้นเรียนไวยากรณ์ง่ายมาก เพียงเพิ่ม <ชื่อตัวละครและระดับผู้ปกครองเพื่องบเรียนสามารถ ตัวอย่างต่อไปนี้จะกำหนดระดับBigBoxBox เป็นประเภทรอง:

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

ค่าคงที่ระดับ

คุณสามารถกำหนดระดับภายในอย่างต่อเนื่องโดยทางตรงค่าตัวเลขหรือสตริงกับนิยามตัวแปรซึ่งไม่จำเป็นต้องมีการใช้งานอย่างต่อเนื่องหรือ @ @@ ตามแบบแผนชื่อของการใช้ตัวพิมพ์ใหญ่อย่างต่อเนื่อง

ครั้งหนึ่งเคยเป็นคงที่มีการกำหนดคุณไม่สามารถเปลี่ยนค่าของคุณโดยตรงสามารถเข้าถึงค่าคงที่ภายในในชั้นเรียนเช่นการเข้าถึงตัวแปรเดียวกัน แต่ถ้าคุณต้องการที่จะเข้าถึงระดับคงที่ภายนอกแล้วคุณจะต้องใช้ClassName :: คงที่ ดังแสดงในตัวอย่างต่อไปนี้

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

ข้อมูลระดับ

ทับทิมของตนเองและ Java นี้จะคล้ายกัน แต่ที่แตกต่างกัน Java วิธีการมีการอ้างอิงในวิธีการเช่นนี้จึงมักจะหมายถึงวัตถุปัจจุบัน สายรหัสทับทิมโดยสายดังนั้นในบริบทที่แตกต่าง (บริบท) ตัวเองมีความหมายที่แตกต่างกัน ลองมาดูตัวอย่างต่อไปนี้:

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

ซึ่งหมายความว่าการเรียนสามารถกำหนดได้โดยระดับเป็นวัตถุปัจจุบันในการดำเนินการ แต่ยังหมายความว่าเมตาชั้นและความหมายวิธีการเรียนของผู้ปกครองในระหว่างการดำเนินกระบวนการที่มีอยู่