Menu
Coddy logo textTech

Modüller ve include

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 57.

Bir modül, adlandırılmış bir metot grubudur. Nesneler oluşturamaz; ancak bir sınıf onu include edebilir ve ardından her örnek, sanki sınıf onları tanımlamış gibi modülün metotlarına sahip olur. Buna mixin denir:

module Greetable
  def greet
    "Hello, I am #{name}"
  end
end

class Person
  include Greetable
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

puts Person.new("Ada").greet

Çıktı:

Hello, I am Ada

Bir modülün yöntemleri, yukarıdaki name gibi sınıfın sağladığı yöntemleri çağırabilir. Bu nedenle, her biri modülün kullandığı şeyleri sunduğu sürece, tek bir modül çok farklı sınıflara hizmet edebilir:

module Greetable
  def greet
    "Hello, I am #{name}"
  end
end

class Robot
  include Greetable

  def name
    "R2"
  end
end

class City
  include Greetable

  def name
    "Paris"
  end
end

puts Robot.new.greet
puts City.new.greet

Çıktı:

Hello, I am R2
Hello, I am Paris

Bir sınıfın yalnızca bir üst sınıfı vardır, ancak istediği sayıda modül içerebilir. include?, bir sınıfın bir modülü içerip içermediğini sorar ve modül ancestors içinde, sınıftan hemen sonra görünür; Ruby yöntemlerini burada arar:

module Swimmer
  def swim
    "swimming"
  end
end

module Flyer
  def fly
    "flying"
  end
end

class Duck
  include Swimmer
  include Flyer
end

d = Duck.new
puts "#{d.swim}, #{d.fly}"
puts Duck.include?(Flyer)
p Duck.ancestors.take(3)

Çıktı:

swimming, flying
true
[Duck, Flyer, Swimmer]

Modüller ayrıca ilgili sınıfları ve sabitleri tek bir ad, yani bir ad alanı altında gruplandırır; böylece adlar çakışmaz. Shop::Item ve Game::Item farklı sınıflardır:

module Shop
  TAX = 0.2

  class Item
    def label
      "shop item, tax #{TAX}"
    end
  end
end

puts Shop::Item.new.label
puts Shop::TAX

Çıktı:

shop item, tax 0.2
0.2
challenge icon

Görev

Kolay

Modülleri ve sınıfları tamamla. Greetable#greet, nesnenin name değerini kullanarak Hello, I am Ada döndürür. Walkable#walk(steps), @steps içinde tutulan sayaca (ilk seferde nil ile başlayarak) adımları ekler ve toplamı güncel olan Ada walked 30 steps değerini döndürür. Person her iki modülü de içerir; Robot ise yalnızca Greetable modülünü içerir ve adı, seri numarasının önüne R- getirilmesiyle oluşturulur.

Sağlanan kod, ilk satırdan (Ada 7) bir kişi ve bir robot oluşturur; ardından greet p, greet r veya walk 10 (kişi için) komutlarını çalıştırır, her sonucu yazdırır ve son olarak robot walks: false yazdırır.

Kodun greetable.rb, walkable.rb, person.rb ve robot.rb dosyalarına yazılmalıdır. main.rb, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'greetable'
require_relative 'walkable'
require_relative 'person'
require_relative 'robot'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
  input << line.chomp
end
name, serial = input[0].split
person = Person.new(name)
robot = Robot.new(serial)
input.drop(1).each do |line|
  command, arg = line.split
  if command == "walk"
    puts person.walk(arg.to_i)
  else
    target = arg == "p" ? person : robot
    puts target.greet
  end
end
puts "robot walks: #{Robot.include?(Walkable)}"
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi